Estoy teniendo problemas para liberar un vector que contiene varios punteros los cuales apuntan a buffers de memoria reservados con el malloc. El código es el siguiente:
La función "GenerarDatosBuffer" simplemente llena de información el buffer ya que es necesario para ver la memoria ocupada.
El problema radica que a la hora de liberar la memoria de "a buffers", en la primera vuelta se vé que se libera la memoria paulativamente 640x576 bytes por c/segundo. Sin embargo en la segunda vuelta, no se liberá de "a buffers", sino que se libera toda la memoria 20x640x576 bytes de un saque una vez liberado el último elemento, algo que en definitiva no resulta de utilidad, ya que necesito si o si liberar de "a buffers".
Lo mismo ocurre si utilizo listas simplemente enlazadas en vez de un vector de punteros, en la primera vuelta se libera de "a buffers", sin embargo a la segunda vuelta se libera toda la memoria una vez liberado el último elemento.
Es como si el SO intentara hacer un cache del bloque de memoria reutilizado.
PHP:
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#define REPETICION 2
#define NUM_FRAMES 20
void GenerarDatosBuffer(unsigned char* buffer)
{
int y, x, paso;
for(y=0; y<576; y++)
{
paso=y*640;
for(x=0; x<640; x++)
{
*(buffer+paso+x)=x;
}
}
}
int main() //No se tuvo en cuenta la dimension variable de la matrix -> pensado para 3x3
{
void *buffer[NUM_FRAMES];
unsigned int cont, cont2;
for(cont2=0; cont2<REPETICION; cont2++)
{
for(cont=0; cont<NUM_FRAMES; cont++)
{
buffer[cont]=malloc(640*576*sizeof(char));
if(!buffer[cont])
{
printf("Error al reservar memoria!\n");
return -1;
}
GenerarDatosBuffer((unsigned char*)(buffer[cont]));
}
for(cont=0; cont<NUM_FRAMES; cont++)
{
free(buffer[cont]); //Libero memoria!
sleep(1);
}
}
return 0;
}
La función "GenerarDatosBuffer" simplemente llena de información el buffer ya que es necesario para ver la memoria ocupada.
El problema radica que a la hora de liberar la memoria de "a buffers", en la primera vuelta se vé que se libera la memoria paulativamente 640x576 bytes por c/segundo. Sin embargo en la segunda vuelta, no se liberá de "a buffers", sino que se libera toda la memoria 20x640x576 bytes de un saque una vez liberado el último elemento, algo que en definitiva no resulta de utilidad, ya que necesito si o si liberar de "a buffers".
Lo mismo ocurre si utilizo listas simplemente enlazadas en vez de un vector de punteros, en la primera vuelta se libera de "a buffers", sin embargo a la segunda vuelta se libera toda la memoria una vez liberado el último elemento.
Es como si el SO intentara hacer un cache del bloque de memoria reutilizado.