Red de conocimiento informático - Aprendizaje de programación - ¿Cuáles son los usos específicos de malloc y free?

¿Cuáles son los usos específicos de malloc y free?

I.Conceptos básicos y uso básico de malloc() y free():

1. Prototipo y descripción de la función:

void *malloc(long NumBytes): esta función asigna palabras de NumBytes sección y devuelve un puntero a esa memoria. Si la asignación falla, se devuelve un puntero nulo (NULL).

Hay muchas razones por las que falla la asignación y la falta de espacio es una de ellas.

void free(void *FirstByte): Esta función se utiliza para devolver el espacio previamente asignado mediante malloc al programa o sistema operativo, es decir, liberar la memoria y volver a liberar espacio.

2. Uso de funciones:

De hecho, estas dos funciones no son difíciles de usar después de malloc(), si crees que es suficiente, simplemente tíralas a free(. ). Por ejemplo Un ejemplo simple:

Código de programa:

// Código...

// Código...

char * Ptr = NULL

Ptr = (char *)malloc(100 * sizeof(char)); > {

salir (1);

}

obtiene(Ptr

// Código...

gratis(Ptr );

Ptr = NULL;

// Código...

¡Eso es! Por supuesto, las situaciones específicas deben analizarse y resolverse de manera concreta. Por ejemplo, si define un puntero, solicita una porción de memoria en una función y luego la pasa de regreso al puntero a través del retorno de la función, entonces tal vez la liberación de la porción de memoria debería dejarse en manos de otra función.

3. Algunas cosas a las que debe prestar atención al utilizar funciones:

A. Después de solicitar espacio en la memoria, debe verificar si la asignación se realizó correctamente.

B. Cuando la memoria aplicada ya no sea necesaria, recuerde liberarla; al liberarla, apunte el puntero a esta memoria a NULL para evitar que el programa la use accidentalmente en el futuro.

C. Estas dos funciones deben usarse en pares. Si no se libera después de la aplicación, es una pérdida de memoria; si se libera sin motivo, no se hace nada. Solo se puede liberar una vez. Si se libera dos o más veces, se producirá un error

(liberar el puntero nulo es una excepción. Liberar el puntero nulo en realidad no significa liberar nada, por lo que no importa). cuántas veces se libera el puntero nulo).

4. Aunque el tipo de función malloc() es (void *), cualquier tipo de puntero se puede convertir a (void *), pero es mejor forzar la conversión de tipo al frente, porque esto puede evitar la compilación

Algunas comprobaciones en el servidor.

¡Está bien! ¡Eso es todo lo básico! Ahora ingrese a la segunda parte:

¿De dónde obtiene II.malloc() el espacio de memoria?

1. ¿De dónde obtiene malloc() el espacio de memoria? La respuesta es obtener espacio desde el interior del montón. Es decir, la función devuelve un puntero a un fragmento de memoria en el montón. El sistema operativo tiene una lista en cadena de direcciones de memoria libre. Cuando el sistema operativo recibe una solicitud de un programa, recorre la lista, busca el primer nodo del montón con más espacio que el espacio solicitado, luego elimina ese nodo de la lista de nodos libres y asigna el espacio en ese nodo al programa. ¡Eso es todo!

Dicho esto, debo insertar otro pequeño tema, creo que debes saber de qué se trata. ¿Qué es un montón? Cuando hablamos del montón, ¡tenemos que hablar de la pila! ¿Qué es un montón? A continuación, el editor hablará brevemente sobre esta parte fuera de tema:

2. ¿Qué es un montón? El montón es el espacio que todos tienen y se divide en un montón global y un montón local. El montón global es todo espacio no asignado y el montón local es espacio asignado por el usuario. El montón se asigna durante el proceso de inicialización del sistema operativo. También puede solicitar un montón adicional al sistema durante la operación, pero recuerde devolverlo al sistema operativo después de su uso; de lo contrario, provocará una pérdida de memoria.

Qué es una pila: la pila es exclusiva de un hilo. Guarda el estado de ejecución del hilo y las variables automáticas locales. La pila se inicializa cuando se inicia un subproceso y la pila de cada subproceso es independiente entre sí. Cada función tiene su propia pila, que se utiliza para pasar parámetros entre funciones. Al cambiar de hilo, el sistema operativo cambia automáticamente la pila alternando el registro SS/ESP. En lenguajes de alto nivel, no es necesario asignar y desasignar espacio de pila explícitamente.

La descripción del concepto anterior es una descripción del concepto estándar, pero he eliminado algunas oraciones, no sé si se ha vuelto inestable debido a esto.

De lo anterior. descripción del concepto, puede Puede ver:

El compilador asigna y libera automáticamente la pila y almacena los valores de los parámetros de función, variables locales, etc. Funciona de manera similar a las estructuras de datos. Su funcionamiento es similar a una pila en una estructura de datos.

El montón normalmente lo asigna y libera el programador, o si no, puede ser reclamado por el sistema operativo al final del programa. Tenga en cuenta que esto es posible, no seguro. Por eso quiero enfatizar nuevamente, ¡recuerda soltar!