¿Hay alguna razón para llamar eliminar en C ++ cuando un progtwig sale de todas formas?

En mi función main C ++, por ejemplo, si tenía un puntero a una variable que utiliza memoria de stack (en oposición a la memoria de stack), ¿esto se desasigna automáticamente después de que se cierra mi aplicación? Yo asumiría eso.

Aun así, ¿es una buena práctica eliminar siempre las asignaciones de stack incluso si piensa que nunca se usarán en una situación en la que la memoria se desasigna automáticamente al salir?

Por ejemplo, ¿hay algún punto para hacer esto?

 int main(...) { A* a = new A(); a->DoSomething(); delete a; return 0; } 

Estaba pensando que tal vez en caso de que refactorice (u otra persona refactorice) ese código y lo coloque en otra parte de la aplicación, donde delete es realmente necesario.

Además de la respuesta de Brian R. Bondy (que habla específicamente sobre las implicaciones en C ++), Paul Tomblin también tiene una buena respuesta a una pregunta específica de C , que también habla sobre el destructor de C ++.

Es importante llamar explícitamente a eliminar porque puede tener algún código en el destructor que quiera ejecutar. Como escribir algunos datos en un archivo de registro. Si deja que el sistema operativo libere su memoria, su código en su destructor no se ejecutará.

La mayoría de los sistemas operativos desasignarán la memoria cuando finalice su progtwig. Pero es una buena práctica desasignarlo usted mismo y, como dije antes, el sistema operativo no llamará a su destructor.

En cuanto a llamar a la eliminación en general, sí, siempre desea llamar a eliminar, o de lo contrario tendrá una pérdida de memoria en su progtwig, lo que dará lugar a nuevas asignaciones que fallan.

Sí, ayuda a eliminar los falsos positivos cuando ejecuta su progtwig a través de una herramienta de detección de fuga de memoria.

Sí.

  • El estándar no garantiza que el sistema operativo limpiará la memoria. Puede esperar esto en las principales plataformas, pero ¿por qué arriesgarse?
  • Minimiza el desorden informado por herramientas como valgrind si no pierde memoria deliberadamente.
  • Si te metes en este hábito, ¿quién puede decir que un día no aplicarás accidentalmente este enfoque en algún lugar importante?
  • Puede necesitar destrucción de objetos. Por lo general solo asume que lo haces. No te lastima.

Considere el caso en el que el objeto a eliminar adquirió un recurso externo que no puede ser liberado de forma segura por el sistema operativo. Si no llama a eliminar en ese objeto, tiene una fuga real.

Piensa en tu clase A teniendo que destruir.
Si no llama a delete en a , ese destructor no se llamará. Generalmente, eso no importará realmente si el proceso finaliza de todos modos. Pero, ¿qué ocurre si el destructor tiene que liberar, por ejemplo, objetos en una base de datos? ¿Vaciar una caché a un archivo de registro? Escribir una memoria caché de nuevo en el disco?

Verá, no es solo una “buena práctica” eliminar objetos, en algunas situaciones es necesario.

Otra razón para eliminar explícitamente objetos es que si su aplicación tiene una pérdida real de memoria, es más fácil usar herramientas como valgrind para encontrar las fugas si no tiene que pasar por “fugas” que provienen de no molestarse en limpiar.

Otra razón para eliminar es evitar falsas alarmas de un detector de fugas que pueda usar en el futuro. Si tiene falsas alarmas, puede que no preste atención a una fuga real informada por un detector de fugas: se ocultará entre las falsas en el informe.

siempre asegúrate de eliminarlo tú mismo. Un sistema operativo se encargará de esto, pero para excluir errores que pueden evitarse fácilmente