Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Locura_23 en 30 Junio 2021, 23:30 pm



Título: Saber la memoria liberada con free() ?
Publicado por: Locura_23 en 30 Junio 2021, 23:30 pm
Buenas a todos! alguien sabe si hay una manera de saber la memoria que liberaste con free() ? Si bien se podria hacer el calculo en el momento de la asignación de memoria... tal vez hay otra manera de hacer eso?
Un ejemplo:

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.    int num = 0;
  8.    int *pArreglo = NULL;
  9.  
  10.    do
  11.    {
  12.        printf("Ingrese la cantidad espacios a reservar en el arreglo.\n");
  13.        scanf("%i",&num);
  14.    }while(num > 0);
  15.  
  16.    pArreglo = (int *) calloc ( num, sizeof(int) );
  17.  
  18.    if(pArreglo == NULL)
  19.    {
  20.        printf("Error en la asignacion de memoria.\n");
  21.        exit(EXIT_FAILURE);
  22.    }
  23.  
  24.    free(pArreglo);
  25.  
  26.    return 0;
  27. }
  28.  
  29.  


Título: Re: Saber la memoria liberada con free() ?
Publicado por: Loretz en 1 Julio 2021, 01:34 am
¿hay una manera de saber la memoria que liberaste con free()?

No.

La forma y la cantidad de memoria asignada con malloc, calloc o realloc depende exclusivamente de tu compilador ("implementation defined"). Algunos compiladores suelen asignar un bloque de memoria mayor al que estrictamente se necesitaría, para poder disponer de información de cuánta memoria dinámica deberá liberar free().

Por ejemplo, un método frecuente en algunos compiladores es escribir primero datos sobre el tamaño, un checksum, un par de punteros a los bloques anterior y siguiente, algún marcador. y alguna cosa más, y a continuación los bytes que se solicitaron como múltiplos de 16 (a modo de optimización).

En tu ejemplo sería: primero calloc busca memoria para esa estructura de datos más la cantidad num * sizeof(int) de bytes a alojar como múltiplo de 16 (si necesita alojar 10 int, digamos 40 bytes, agregará 48 = 16*3).

Luego, la dirección devuelta por calloc es la dirección donde comienzan esos datos iniciales, no donde comienza la serie de ints.

Pero como te decía, el mecanismo real depende de cada compilador, de modo que lo que funcione para el tuyo no necesariamente funcionará para otro.





Título: Re: Saber la memoria liberada con free() ?
Publicado por: Locura_23 en 1 Julio 2021, 01:46 am
Mmm ya veo, así que depende de cada compilador, muy interesante. Gracias por tu respuesta!