¿Cómo libero memoria en C?

5 minutos de lectura

avatar de usuario
andrey

Estoy escribiendo código que tiene muchas matrices de 1 y 2 dimensiones. Recibí “error: no se puede asignar la región” y creo que se debe a que se asignó demasiada memoria. Uso las funciones “malloc” y “free”, pero no estoy seguro de estar usándolas correctamente. ¿Quizás sabes dónde puedo ver buenos ejemplos de gestión de memoria en C?

así que… Solo trato de hacer que un algoritmo funcione y, por ahora, este código es solo una función tras otra…

//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 el free ¿función?

  • ¿Quizás sería más constructivo mostrarnos lo que intentaste?

    – cnicutar

    30 de enero de 2012 a las 18:59

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

    – akira

    30/01/2012 a las 19:00

Tienes que free() la memoria asignada en orden inverso exacto de cómo se asignó usando 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 arreglos 1D:

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

Desasignación de memoria para arreglos 1D:

    free(buffer);

Asignación de memoria para arreglos 2D:

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

Desasignación de memoria para arreglos 2D:

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

    free(cross_norm);

En realidad, no puede “liberar” memoria manualmente en C, en el sentido de que la memoria se libera del proceso de regreso al sistema operativo … cuando llama malloc(), el tiempo de ejecución de libc subyacente solicitará al 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 enlazada llamada “almacén gratuito” que administra esta región de memoria asignada. Cuando usted llama malloc(), busca rápidamente en la tienda libre un bloque de memoria libre del tamaño solicitado. A continuación, ajusta la lista vinculada para reflejar que se ha extraído una parte de la memoria del grupo de memoria asignado originalmente. Cuando usted llama free() el bloque de memoria se vuelve a colocar en el almacén gratuito como un nodo de lista enlazada que indica que es un fragmento de memoria disponible.

Si solicita más memoria de la que se encuentra en la tienda gratuita, libc-runtime volverá a solicitar más memoria del sistema operativo hasta el límite de la capacidad del sistema operativo para asignar memoria para ejecutar procesos. Sin embargo, cuando libera memoria, no se devuelve al sistema operativo… por lo general, se recicla de nuevo en la tienda gratuita, donde puede ser utilizada nuevamente por otra llamada a malloc(). Por lo tanto, si realiza muchas llamadas a malloc() y free() con solicitudes de tamaño de memoria variable, podría, en teoría, causar una condición llamada “fragmentación de memoria”, donde hay suficiente espacio en el almacén gratuito para asignar el bloque de memoria solicitado, pero no suficiente contiguo espacio para el tamaño del bloque que ha solicitado. Así la llamada a malloc() falla, y está efectivamente “sin memoria” a pesar de que puede haber mucha memoria disponible como una cantidad total de bytes en la tienda libre.

  • ¿Soy solo yo o es que OP está preguntando algo diferente y la respuesta (aunque muy bien) explica algo más?

    – Alok Guardar

    30 de enero de 2012 a las 19:31

  • 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 seguir siendo instructiva incluso si no responde explícitamente a su pregunta actualizada. Su pregunta original no tenía código y era básicamente que estaba usando malloc y free, pero aún termina con un error de “no se puede asignar la región”. Me sonaba como una posible fragmentación de la memoria, así que pensé que esta podría ser una buena respuesta.

    – Jasón

    30 de enero de 2012 a las 19:40

  • Ah, ya veo. bueno. Es una buena explicación, aunque la Pregunta cambiada hace que se sienta fuera de lugar. De todos modos, tiene mi +1 por el esfuerzo.

    – Alok Guardar

    30 de enero de 2012 a las 19:43

  • ¿Cómo arreglarías esa fragmentación?

    – RastaJedi

    6 de marzo de 2016 a las 6:28

  • Hay una serie de opciones, pero una estrategia de descenso sería usar algún tipo de asignador de memoria de bloque pequeño personalizado que tome una gran parte de la memoria del sistema operativo y luego asigne memoria desde dentro de ese bloque grande de una manera que evite la fragmentación de la memoria. de asignaciones aleatorias de tamaño de memoria

    – Jasón

    22 de marzo de 2019 a las 15:12


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad