es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Averiguar si la memoria asignada fue liberada por la función realloc() en C.

Una parte de mi código principal contiene:

int* p = NULL;
p = malloc(sizeof(int)*10);
p = realloc(p, sizeof(int) * 5);
free(p);

¿Existe alguna manera de saber si, después de la reasignación, el puntero p apunta a un bloque de memoria de tamaño 20 bytes y ya no de 40 bytes?

Lo ideal sería tener una función que tome una dirección de memoria como argumento y que diga si está asignada o libre. ¿Existe tal función?

Otra idea sería verificar el tamaño antes y después de la realloc() de la memoria asignada. Pero no veo cómo el sizeof() podría ayudar, porque ¿cómo identificaría el bloque de memoria? sizeof() envía el tamaño de variables y no el tamaño de un bloque de memoria. sizeof(p) me dará 8 bytes, ya que p es un puntero y sizeof (*p) es 4, ya que p apunta a un entero.

Quizás exista un uso especial de sizeof () o alguna otra función.

Lee más si quieres saber por qué pregunto…

Si inicializo mi p para contener/apuntar a una matriz:

for (int i = 0; i < 3; i++){
   p[i] = i;
}

Ahora quiero que p contenga solo {0,1,2}, así que quiero reasignar p de sizeof(int)* 5 a sizeof(int)*3.

Pero supongamos que realmente no sé si p debería reasignarse, el bloque de memoria es de 20 bytes, pero tal vez ya es de 12 bytes, y realloc () no es necesaria. Sé que puedo ejecutar realloc() de cualquier manera y no perjudica, por lo que tal vez no sea realmente una buena razón para esta pregunta. Pero en un código más largo es fácil perder el rastro de la cantidad de memoria asignada.

Cualquier ayuda será muy apreciada.

PD: si nadie responde, tendré que conformarme con que valgrind envíe 0 errores.

Después de todo, si algo está mal, por ejemplo, escribir en los bytes 21, 22, 23 y 24 de la memoria (por ejemplo, p[4] = 7) de un bloque de 20 bytes (porque p = realloc(p, sizeof(int) * 5)), valgrind envía errores del tipo "escritura inválida de tamaño 4", pero para obtener eso necesito escribir en esta memoria. Este método de verificación me hace querer obtener errores, porque si puedo predecir con precisión un error, entonces sé el tamaño real de la memoria asignada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de verificar el tamaño de la memoria asignada después de realloc() es usar la función malloc_usable_size() del archivo de cabecera <malloc.h>. Esta función devuelve el tamaño real del bloque de memoria asignado por malloc o realloc, independientemente del argumento que se le pase. Así que, después de realloc(), se puede usar malloc_usable_size(p) para obtener el tamaño real del bloque de memoria apuntado por p.

    Sin embargo, tenga en cuenta que esta función no es parte del estándar C y puede no estar disponible en todas las plataformas, por lo que no es una solución portátil. Otra desventaja de esta función es que no es segura para subprocesos.

    Alternativamente, se puede hacer un seguimiento del tamaño de los bloques de memoria asignados uno mismo, usando una variable separada para almacenar el tamaño real del bloque. Por ejemplo:

    int* p = NULL;
    size_t size = 0;
    
    p = malloc(sizeof(int) * 10);
    size = sizeof(int) * 10;
    
    p = realloc(p, sizeof(int) * 5);
    size = sizeof(int) * 5;
    
    free(p);
    

    De esta manera, siempre se sabe el tamaño real del bloque de memoria apuntado por p, independientemente del argumento pasado a realloc(). Sin embargo, se debe asegurar de actualizar la variable size cada vez que se llame a realloc().

    En resumen, no hay una función integrada en C que pueda decirle el tamaño real de un bloque de memoria apuntado por un puntero. Se puede usar malloc_usable_size() o hacer un seguimiento del tamaño uno mismo usando una variable separada.</malloc.h>

Comments are closed.