C++ Memoria dinámica
Entender cómo funciona la memoria dinámica en C++ es esencial para convertirte en un programador de C++ competente. La memoria en un programa de C++ se divide en dos partes:
- Pila (stack):Todas las variables declaradas dentro de una función ocuparán memoria de la pila.
- Montón (heap):Esta es la memoria no utilizada del programa, que se puede usar para asignar memoria dinámicamente durante la ejecución del programa.
Muchas veces no puedes predecir de antemano cuánta memoria necesitas para almacenar información específica en una variable definida; el tamaño de memoria requerido solo puede determinarse en tiempo de ejecución.
En C++, puedes usar operadores especiales para asignar memoria en el montón en tiempo de ejecución para variables de un tipo dado, lo que devuelve la dirección del espacio asignado. Este tipo de operador esnewoperador.
Si ya no necesitas el espacio de memoria asignado dinámicamente, puedes usardeleteoperador para liberar la memoria asignada previamente por el operador new.
Los operadores new y delete
A continuación se muestra la sintaxis general para usar el operador new a fin de asignar memoria dinámicamente para cualquier tipo de datos:
new data-type;
Aquí,data-typepuede ser cualquier tipo de datos integrado, incluidos los arreglos, o cualquier tipo de datos definido por el usuario, incluidas clases o estructuras. Veamos primero los tipos de datos integrados. Por ejemplo, podemos definir un puntero al tipo double y luego solicitar memoria, la cual se asigna en tiempo de ejecución. Podemos usar la siguiente declaración connewoperador para lograr esto:
Si el área de almacenamiento libre se ha agotado, es posible que la asignación de memoria no se realice correctamente. Por lo tanto, se recomienda verificar si el operador new devuelve un puntero NULL y tomar las medidas adecuadas:
malloc()La función ya apareció en el lenguaje C y todavía existe en C++, pero se recomienda evitar el uso de la función malloc() en la medida de lo posible. En comparación con malloc(), la principal ventaja de new es que new no solo asigna memoria, sino que también crea objetos.
En cualquier momento, cuando consideres que una variable con memoria asignada dinámicamente ya no es necesaria, puedes usar el operador delete para liberar la memoria que ocupa, como se muestra a continuación:
delete pvalue; // 释放 pvalue 所指向的内存
El siguiente ejemplo utiliza los conceptos anteriores y demuestra cómo usar los operadores new y delete:
Ejemplo
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
Value of pvalue : 29495
Asignación dinámica de memoria para arreglos
Supongamos que queremos asignar memoria para un arreglo de caracteres (una cadena de 20 caracteres). Podemos usar la sintaxis del ejemplo anterior para asignar memoria dinámicamente al arreglo, de la siguiente manera:
char* pvalue = NULL; // 初始化为 null 的指针 pvalue = new char[20]; // 为变量请求内存
Para eliminar el arreglo que acabamos de crear, la declaración es la siguiente:
delete [] pvalue; // 删除 pvalue 所指向的数组
A continuación se muestra la sintaxis general del operador new para asignar memoria a arreglos multidimensionales:
Arreglo unidimensional
Arreglo bidimensional
Prueba de ejemplo de arreglo bidimensional:
Ejemplo
Arreglo tridimensional
Ejemplo de prueba de arreglo tridimensional:
Ejemplo
Asignación dinámica de memoria para objetos
Los objetos no son diferentes de los tipos de datos simples. Por ejemplo, mira el siguiente código; usaremos un arreglo de objetos para aclarar este concepto:
Ejemplo
Si deseas asignar memoria para un arreglo que contiene cuatro objetos Box, el constructor se llamará 4 veces; de manera similar, al eliminar estos objetos, el destructor también se llamará la misma cantidad de veces (4 veces).
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
¡Llamando al constructor! ¡Llamando al constructor! ¡Llamando al constructor! ¡Llamando al constructor! ¡Llamando al destructor! ¡Llamando al destructor! ¡Llamando al destructor! ¡Llamando al destructor!Otras extensiones