2009-04-04 12 views
8

Creo que todos entendemos la necesidad de eliminar al reasignar un puntero asignado dinámicamente para evitar fugas de memoria. Sin embargo, tengo curiosidad, ¿hasta qué punto el C++ ordena el uso de eliminar? Por ejemplo, tomemos el siguiente programa¿Siempre nuevo debe ir seguido de eliminar?

int main() 
{ 
    int* arr = new int[5]; 
    return 0; 
} 

Mientras que para todos los efectos, no hay fuga se produce aquí (ya que el programa está llegando a su fin y el sistema operativo va a limpiar toda la memoria una vez que se devuelve), pero lo hace la norma todavía requieren - - o recomendar - el uso de eliminar [] en este caso? Si no, ¿habría alguna otra razón por la que eliminaría [] aquí?

Respuesta

10

No hay nada que requiera un delete [] en la norma - Sin embargo, yo diría que es una muy buena pauta a seguir.

Sin embargo, es mejor práctica eliminar o eliminar [] con cada operación nueva o nueva [], incluso si la memoria se limpiará mediante la terminación del programa.

Muchos objetos personalizados tendrán un destructor que tiene otra lógica que simplemente limpiar la memoria. Usar delete garantiza la destrucción en estos casos.

Además, si alguna vez se mueve en sus rutinas, es menos probable que cause pérdidas de memoria en otros lugares de su código.

0

Usted es libre de olvidarse de eliminar cosas.

¿Te gusta perder memoria?

1

Aquí no. Pero a medida que el programa se hace más grande y más complejo, administraría mi memoria para poder rastrear los errores más rápido. El estándar no dice nada, pero entrar en buenos hábitos en el caso más pequeño conduce a un mejor código a largo plazo.

+0

De hecho, me refiero a que a menudo estoy tipeando instrucciones delete [] justo antes de regresar, aunque sabía (a nivel práctico) que no importaba. Y ese tampoco es un hábito que estoy tratando de detener, solo me interesaba el grado en que el estándar lo recomendaba. – GRB

0

No sé la norma, pero hay un estilo de programación entera en torno a esta pregunta: crash-only softxare bases de datos de Teóricamente o núcleos OS deberían desarrollarse como tal, pero a menudo no es realmente práctico para usarlos así porque en el reinicio hay algo de limpieza que puede ser largo. Además, los sistemas dependientes (programas dentro de un sistema operativo o clientes de bases de datos) pueden no ser solo de bloqueo.

7

Dupe de Is there a reason to call delete in C++ when a program is exiting anyway?

respuesta es que debido a los destructores que se deben ejecutar, a veces es necesario eliminar el objeto antes de salir del programa. Además, muchas herramientas de detección de fuga de memoria se quejarán si no lo hace, por lo que para facilitar la búsqueda de fugas de memoria reales, debe intentar eliminar todos sus objetos antes de salir.

+0

¡Extrañé ese! :) –

+0

Sí, en realidad fue un poco difícil de encontrar; me pegaste a la publicación porque me tomé el tiempo para encontrar ese artículo, ya que sabía que se lo habían pedido en los últimos días. –

Cuestiones relacionadas