Por el contrario, siempre debe preferir las asignaciones de pila, en la medida en que, como regla general, nunca debe tener nuevo / eliminar en su código de usuario.
Como dice, cuando la variable se declara en la pila, su destructor se llama automáticamente cuando sale del alcance, que es su herramienta principal para rastrear la vida útil de los recursos y evitar fugas.
Entonces, en general, cada vez que necesite asignar un recurso, ya sea memoria (llamando a new), manejadores de archivos, sockets o cualquier otra cosa, envuélvalo en una clase donde el constructor adquiere el recurso y el destructor lo libera. Luego, puede crear un objeto de ese tipo en la pila y tiene la garantía de que su recurso se liberará cuando salga del alcance. De esa manera, no tiene que rastrear sus pares nuevos / eliminados en todas partes para asegurarse de evitar pérdidas de memoria.
El nombre más común para este modismo es RAII
También busque las clases de punteros inteligentes que se utilizan para ajustar los punteros resultantes en los raros casos en los que tiene que asignar algo nuevo fuera de un objeto RAII dedicado. En su lugar, pasa el puntero a un puntero inteligente, que luego rastrea su vida útil, por ejemplo, mediante el conteo de referencias, y llama al destructor cuando la última referencia sale del alcance. La biblioteca estándar tiene std::unique_ptr
una gestión sencilla basada en el alcance y std::shared_ptr
que hace referencia al recuento para implementar la propiedad compartida.
Muchos tutoriales demuestran la creación de instancias de objetos utilizando un fragmento como ...
Entonces, lo que has descubierto es que la mayoría de los tutoriales apestan. ;) La mayoría de los tutoriales le enseñan pésimas prácticas de C ++, incluida la llamada a new / delete para crear variables cuando no es necesario, y le dificulta el seguimiento de la vida útil de sus asignaciones.