Una notación para ayudar con la gestión de memoria en lenguaje C

Después de sufrir con la gestión de memoria de un programa en C, me di cuenta que con una pequeña notación se podría hacer el código más entendible en este punto. La notación está descrita en el siguiente enlace:

https://github.com/selairi/memory_notation.h

Lo que sucedió es que al usar una biblioteca, no se dejaba claro qué había que hacer con la gestión de memoria del puntero que devolvía una función. Tuve que leerme en código fuente de dicha biblioteca para averiguarlo, pues en la documentación no se refería nada y estuve gastando bastante tiempo. Entonces pensé… si se le pusiera una palabra clave a la declaración de la función, se sabría lo que hacer rápidamente. Por ejemplo, si en lugar de:

int *function();

que no deja claro si hay que liberar o no la memoria referida por el puntero devuelto, escribo:


memory_take_possession int *function1();
memory_guarded int *function2();

    // ...

    int *p1 = function1();
    int *p2 = function2();
    // ... Código ...
    free(p1);
    // p2 se gestiona en otro sitio, free(p2) sería un error

En este caso la notación indica que nosotros somos los responsables de p1, tomamos posesión de esa memoria, y p2 se gestiona en otro lugar, por lo que va a ser un error liberar esa memoria.

Está ahora más claro lo que se debe hacer con la memoria.

También he escrito etiquetas para otras situaciones como cuando hay un sistema de conteo de referencias, un gestor de basura, el parámetro de una función se usa para devolver valores o para señalar que un puntero depende de otro.

Además he añadido una guía con los errores más comunes y su solución:

https://github.com/selairi/memory_notation.h/blob/main/PROBLEMS.md

Espero que os sea útil.

Esta entrada fue publicada en Programación. Guarda el enlace permanente.

Deja un comentario