C++ (14) y gestión manual de memoria


Acabo de recibir un comentario, me gusta

El problema es la gestión manual de la memoria. delete no tiene lugar en el código de usuario, y a partir de C++14, tampoco tiene new

¿Puede alguien explicarme por qué?

Author: Charles, 2014-03-07

3 answers

Advertencia : Mantengo esta respuesta ya que creo que presenta una mejor práctica que mejorará ~95% del código C++, probablemente incluso más. Dicho esto, por favor lea los comentarios completos para una discusión de algunas advertencias importantes.

Ya que fue mi comentario, aquí está mi presentación explicando esto.

En pocas palabras:

[Raw] punteros deber. ni. propio. recurso.

Es propenso a errores y innecesario porque tenemos mejores formas de administrar los recursos que resultan en menos errores, código más corto y más legible y mayor confianza en la corrección del código. En términos económicos: cuestan menos.

Para ser más específico con respecto al comentario que hice:

A partir de C++11 (disponible desde hace dos años e implementado, en las partes relevantes, por todos los compiladores modernos), la eliminación manual de memoria es completamente innecesaria (a menos que escriba muy de bajo nivel memory handling code) porque siempre puede usar punteros inteligentes en su lugar, y generalmente ni siquiera los necesita (consulte la presentación). Sin embargo, C++11 aún requiere que use new cuando instancie un nuevo std::unique_ptr. En C++14, la función std::make_unique hace innecesario este uso de new. En consecuencia, ya no es necesario.

Todavía hay un lugar para la colocación - new en el código, pero este es (a) un caso completamente diferente del normal new, a pesar de que la sintaxis es similar, y (b) puede ser reemplazado en la mayoría de los casos mediante el uso de la allocator::construct función.


James ha señalado una excepción a esta regla que honestamente había olvidado: cuando un objeto maneja su propio tiempo de vida. Me arriesgaré y diré que este no es un lenguaje común en la mayoría de los escenarios, porque el tiempo de vida del objeto puede siempre gestionarse externamente. Sin embargo, en ciertas aplicaciones puede ser beneficioso desacoplar el objeto del resto del código y dejar se maneja solo. En ese caso, debe asignar dinámicamente el objeto y desasignarlo usando delete this.

 37
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 14:05:16

Smart pointers y a su vez std::make_shared y std::make_unique deben usarse en su lugar porque se trata de new/delete etc. es más propenso a errores cuando las aplicaciones lanzan excepciones, etc.

Los punteros inteligentes se eliminan automáticamente (utilizando RAII ) cuando se usan incluso cuando se lanzan excepciones, a diferencia de new/delete, que puede perder memoria

Ver this y this para más información

 3
Author: const_ref,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 13:11:09

Lo único que dice la declaración citada es que la persona ¿quién dijo que realmente no entiende el diseño del programa o la forma C++ funciona (y la forma en que se usa la memoria dinámica en C++). El la declaración define un anti-patrón, más que cualquier otra cosa.

Hay tipos particulares de aplicaciones donde podría ser aplicable; la aplicación en la que trabajo actualmente es una. Pero no es general, y en la mayoría de las aplicaciones en las que he trabajado en el pasado, la mayoría de las eliminaciones tienen estado en código de usuario. (Aquellos que no estaban en clases básicas como std::vector.)

 -1
Author: James Kanze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 13:19:33