delete - C++, Free-Store vs Heap
delete c++ (7)
Se dice que las asignaciones dinámicas con new/delete
tienen lugar en la tienda libre ,
mientras que malloc/free
operaciones malloc/free
usan el montón .
Me gustaría saber si hay una diferencia real, en la práctica.
¿Los compiladores hacen una distinción entre los dos términos? ( Tienda libre y montón , no new/malloc
)
El montón y la tienda libre no se supone que sean interoperables. En contextos restringidos como en los microcontroladores AVR de 8 bits con la biblioteca estándar C ++ 11, ni siquiera se pueden usar en el mismo programa. Free store y heap hacen sus asignaciones en el mismo espacio de memoria, sobrescribiéndose entre sí estructuras y datos. En este contexto, Free Store es diferente e incompatible con Heap porque la "biblioteca de libre / nueva tienda libre" es más simple (y más rápida) que la "biblioteca de montón Malloc / free / realloc / calloc" y proporciona enormes ganancias de uso de memoria al Programador incrustado de C ++ (en un contexto donde solo tienes 512 bytes de RAM).
Consulte la Biblioteca estándar de 8 bits C ++ 11/14 en https://github.com/ambroise-leclerc/ETL/tree/master/libstd
El término "montón" también puede referirse a una estructura de datos particular, pero en el contexto de las operaciones malloc de C ++, libres, nuevas y eliminadas, los términos "montón" y "almacén libre" se usan de manera más o menos intercambiable.
Free Store es un conjunto de memoria de montón no asignada que se asigna a un programa que utiliza el programa para la asignación dinámica durante la ejecución del programa. Cada programa se proporciona con un grupo de memoria de montón no asignada que puede utilizar durante la ejecución. Este grupo de memoria disponible se conoce como almacenamiento gratuito del programa. La memoria de la tienda gratuita asignada no tiene nombre.
La respuesta de Mike Koval cubre la teoría bastante bien. En la práctica, sin embargo, casi siempre son la misma región de memoria: en la mayoría de los casos, si profundiza en la implementación de compiladores new
, encontrará que se llama malloc()
.
En otras palabras: desde el punto de vista de la máquina, el montón y la tienda libre son la misma cosa. La distinción existe dentro del compilador.
Para hacer las cosas aún más confusas, antes del advenimiento de C ++ dijimos "montón" en el sentido de lo que ahora se llama "tienda gratuita".
No recuerdo el estándar que menciona la palabra montón, excepto en las descripciones de las funciones de montón como push_heap
et al. Todas las asignaciones dinámicas se realizan en la tienda libre.
Para C ++, la diferencia entre la tienda gratuita y el montón se ha vuelto puramente conceptual. Como un frasco para recoger errores, y uno para recolectar cookies. Una está etiquetada de una manera, la otra de otra. Esta designación está destinada a llevar a casa el punto de que NUNCA mezcle "nuevo" y "eliminar" con "malloc", "realloc" o "libre" (o conjuntos de niveles de bits para el caso).
Durante las entrevistas, es bueno decir que "new y delete use the free store, malloc y free use the heap; new y delete llaman al constructor y al destructor, respectivamente, sin embargo malloc y free no lo hacen". Sin embargo, a menudo escuchará que los segmentos de memoria están realmente en la misma área, sin embargo, PUEDE ser específico del compilador, es decir, es posible que ambos puedan designar espacios de memoria diferentes como agrupaciones (no estoy seguro de por qué sería, aunque).
Ver http://www.gotw.ca/gotw/009.htm ; puede describir las diferencias entre el montón y la tienda gratuita mucho mejor de lo que pude:
Tienda libre
La tienda gratuita es una de las dos áreas de memoria dinámica asignadas / liberadas por new / delete. La duración del objeto puede ser menor que el tiempo de almacenamiento asignado; es decir, los objetos de almacenamiento libre pueden tener memoria asignada sin inicializarse inmediatamente, y pueden destruirse sin que la memoria se desasigne inmediatamente. Durante el período en que se asigna el almacenamiento pero fuera del período de vigencia del objeto, se puede acceder y manipular el almacenamiento a través de un vacío * pero no se puede acceder a ninguno de los miembros no estáticos ni a las funciones miembro del protoobjeto, ni se puede manipular su dirección. .
Montón:
El montón es la otra área de memoria dinámica, asignada / liberada por malloc / free y sus variantes. Tenga en cuenta que si bien el nuevo global predeterminado y la eliminación pueden ser implementados en términos de malloc y libres por un compilador particular, el montón no es lo mismo que el almacenamiento gratuito y la memoria asignada en un área no puede desasignarse con seguridad en el otro. La memoria asignada del montón se puede usar para objetos del tipo de clase por ubicación: construcción nueva y destrucción explícita. Si así se usa, las notas sobre la vida útil de los objetos de la tienda se aplican de manera similar aquí.