2012-01-30 12 views
23

Estoy escribiendo el código que tiene un montón de 1 & 2 matrices dimensionales. Obtuve "error: no puedo asignar región" y creo que es porque se asigna demasiada memoria. Uso las funciones "malloc" y "free", pero no estoy seguro de que las esté usando correclyt. ¿Quizás sabes dónde puedo ver buenos ejemplos sobre la gestión de la memoria en C?¿Cómo puedo liberar memoria en C?

así .. Yo sólo estaba tratando de conseguir una obra algoritmo y por ahora este código es simplemente la función después de la función ..

//memory allocation for 1D arrays 
buffer = malloc(num_items*sizeof(double)); 

//memory allocation for 2D arrays 
double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

    //code 
Window(N, window_buffer); 
STFTforBMP(buffer,N,f, window_buffer); 
getMagnitude(buffer,f, N, magnitude); 
calculateEnergy(flux,magnitude, f); 
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f); 
calculateCrossCorrelation(cross, flux, expected_values, f); 
findLargestCrossCorrelation(&cross_max, cross, f); 
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f); 
    ............... 

¿Cómo debo usar la función free?

+6

Tal vez sería más constructivo que nos muestre lo que ha intentado? – cnicutar

+2

muestra tu código. – Pheonix

+0

debe proporcionar ejemplos de lo que hace. de lo contrario, su pregunta es demasiado general para responder más allá: lea las especificaciones. – akira

Respuesta

32

Tienes que free() la memoria asignada en orden inverso exacto de la forma en que se asignó mediante malloc().

Tenga en cuenta que debe liberar la memoria solo después de que haya terminado con el uso de los punteros asignados.

asignación de memoria para arrays 1D: desasignación

buffer = malloc(num_items*sizeof(double)); 

memoria para arrays 1D:

free(buffer); 

asignación de memoria para arrays 2D:

double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
    for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

cancelación de asignación de memoria para matrices 2D:

for(i=0; i<150;i++) 
    { 
     free(cross_norm[i]); 
    } 

    free(cross_norm); 
24

En realidad, no puede "liberar" manualmente la memoria en C, en el sentido de que la memoria se libera del proceso al sistema operativo ... cuando llame al malloc(), el libc-runtime subyacente solicitará desde el sistema operativo una región de memoria. En Linux, esto se puede hacer a través de una llamada relativamente "pesada" como mmap(). Una vez que esta región de memoria se asigna a su programa, hay una configuración de lista vinculada llamada "tienda gratuita" que gestiona esta región de memoria asignada. Cuando llama al malloc(), rápidamente busca en el free-store un bloque de memoria libre al tamaño solicitado. A continuación, ajusta la lista vinculada para reflejar que se ha eliminado un trozo de memoria del grupo de memoria asignado originalmente. Cuando llama al free(), el bloque de memoria se vuelve a colocar en la tienda libre como un nodo de lista vinculada que indica que se trata de un fragmento de memoria disponible.

Si solicita más memoria que la que está ubicada en la tienda libre, el libc-runtime volverá a solicitar más memoria del sistema operativo hasta el límite de la capacidad del sistema operativo de asignar memoria para procesos en ejecución. Sin embargo, cuando liberas memoria, no se devuelve al sistema operativo ... por lo general, se recicla a la tienda libre, donde se puede utilizar de nuevo con otra llamada al malloc(). Por lo tanto, si realiza muchas llamadas a malloc() y free() con solicitudes de tamaño de memoria variables, podría, en teoría, causar una condición llamada "fragmentación de memoria", donde hay espacio suficiente en la tienda libre para asignar su bloque de memoria solicitado , pero no lo suficiente contiguo espacio para el tamaño del bloque que ha solicitado. Por lo tanto, la llamada al malloc() falla, y usted es efectivamente "sin memoria", aunque puede haber suficiente memoria disponible como una cantidad total de bytes en la tienda libre.

+2

¿Es solo yo o es que OP está pidiendo algo diferente y la respuesta (aunque muy bien) explica algo más? –

+3

El OP actualizó su pregunta mientras escribía mi respuesta (supongo que en respuesta a algunos de los comentarios) ... Pensé que mi respuesta podría ser instructiva incluso si no respondía explícitamente a su pregunta actualizada. Su pregunta original no tenía código y básicamente era que estaba usando 'malloc' y' free', pero aún así terminaba con un error de "no puede asignar región". Me pareció posible la fragmentación de la memoria, así que pensé que podría ser una buena respuesta. – Jason

+0

Ah, ya veo. bueno. Es una buena explicación, aunque la pregunta cambiada la hace sentir fuera de lugar. De todos modos, tienes mi +1 por el esfuerzo. –

Cuestiones relacionadas