Saltar al contenido

¿Cómo verificar si un puntero ya está liberado en C?

El tutorial o código que verás en este artículo es la solución más eficiente y válida que hallamos a esta duda o dilema.

Solución:

no puedes La forma de rastrear esto sería asignar el puntero a 0 o NULL después de liberarlo. Sin embargo, como mencionó Fred Larson, esto no afecta a otros punteros que apuntan a la misma ubicación.

int* ptr = (int*)malloc(sizeof(int));
free(ptr);
ptr = NULL;

no puedes solo asigna NULL después de ti free para asegurarse de no liberarlo dos veces (está bien free(NULL)).

Mejor aún, si es posible, no escriba código donde “olvida” que ya lo liberó.

EDITAR

Interpretando la pregunta como cómo saber si la memoria a la que apunta un puntero ya está liberada: no puedes hacerlo. Tienes que hacer tu propia contabilidad.

No hay una forma confiable de saber si un puntero se ha liberado, como comentó Greg, la memoria liberada podría estar ocupada por otros datos irrelevantes y obtendrá un resultado incorrecto.

Y, de hecho, no existe una forma estándar de verificar si un puntero está liberado. Eso dijo, glibc tiene funciones (mcheck, mprobe) para encontrar el estado malloc de un puntero para verificar la consistencia del montón, y uno de ellos es ver si un puntero está liberado.

Sin embargoestas funciones se usan principalmente solo para la depuración y no son seguras para subprocesos. Si no está seguro del requisito, evite estas funciones. Solo asegúrate de haber emparejado malloc/free.


Ejemplo http://ideone.com/MDJkj:

#include 
#include 
#include 

void no_op(enum mcheck_status status) 

int main()

    mcheck(&no_op);

    void* f = malloc(4);

    printf("%d (should be %d)n", mprobe(f), MCHECK_OK);
    printf("%d (should be %d)n", mprobe(f), MCHECK_OK);

    free(f);

    printf("%d (should be %d)n", mprobe(f), MCHECK_FREE);
    printf("%d (should be %d)n", mprobe(f), MCHECK_FREE);

    return 0;

Sección de Reseñas y Valoraciones

Nos puedes sustentar nuestra ocupación mostrando un comentario y dejando una valoración te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *