Asignación hace dos cosas:
1) Asigna memoria para el objeto
2) llama al constructor de la memoria asignada
Supresión hace dos cosas:
1) llama al destructor del objeto
2) Desasigna la memoria utilizada por el objeto destruido
Cuando asigna en la pila (A a;
), le está diciendo al compilador "por favor, haga un objeto para mí, asignando memoria, luego llame al t él constructor en esa memoria. Y mientras lo hace, ¿podría manejar llamar al destructor y liberar la memoria, cuando se sale del alcance? ¡Gracias! ". Una vez que la función (principal) finaliza, el objeto sale del ámbito, se llama al destructor y se libera la memoria.
Cuando asigna en el montón (A* pa = new A();
), le está diciendo al compilador "Por favor, haz un objeto para mí". Sé lo que estoy haciendo, así que no te molestes en llamar al destructor o en liberar la memoria. Te diré cuándo hacerlo, en otro momento ". Una vez que la función (principal) finaliza, el objeto que asignaste permanece dentro del alcance, y no se destruye o libera. Afortunadamente, tienes un puntero almacenado en otro lugar de tu programa (como en, copió pa en alguna otra variable con un alcance mayor). Tendrá que decirle al compilador que destruya el objeto y libere la memoria en algún momento en el futuro. De lo contrario, obtendrá una pérdida de memoria.
En pocas palabras, el comando "eliminar" es solo para objetos asignados en el montón, porque esa es la interfaz de administración de memoria manual en C++ - nuevo/eliminar. Es un comando para el asignador de montón, y el asignador de montón no Saber algo acerca de los objetos asignados a la pila. Si intentas llamar a eliminar en un objeto asignado a la pila, también podrías haberlo llamado en una dirección de memoria aleatoria: son lo mismo en la medida en que el asignador de heap es contra. Cerned Muy parecido al intentar acceder a un objeto fuera de límites de la matriz:
int a[10];
std::cout << a[37] << "\n"; // a[37] points at... ? no one knows!
Simplemente no tiene la intención de hacer eso :)
Editar: P. S. Las pérdidas de memoria son más importantes cuando asigna memoria en una función que no sea main
. Cuando el programa finaliza, la memoria filtrada se desasigna, por lo que una pérdida de memoria en main puede no ser un gran problema, dependiendo de su escenario. Sin embargo, los destructores nunca reciben un llamado a los objetos filtrados. Si el destructor hace algo importante, como cerrar una base de datos o un archivo, entonces es posible que tenga un error más grave en sus manos.
Por favor, cambie 'void main (void)' a 'int main()'. – avakar
Sí. En general, no desea escribir la función (nulo) {}. Muchas autoridades lo consideran mala sintaxis: http://www.parashift.com/c++faq-lite/newbie.html#faq-29.4 –