¿Hay algún inconveniente con el uso de make shared para crear un rpp compartido


Hay inconvenientes con usar make_shared<T>() en lugar de usar shared_ptr<T>(new T).

Boost documentación estados

Ha habido reiteradas peticiones de usuarios para una función de fábrica que crea un objeto de un tipo dado y devuelve un shared_ptr. Aparte comodidad y estilo, tal función es también excepción segura y considerablemente más rápido, ya que puede utilizar una asignación única para ambos objeto y su correspondiente control bloque, eliminar un significativo parte de la construcción de shared_ptr sobrecarga. Esto elimina uno de los principales quejas sobre eficiencia shared_ptr.

Author: Tobias Furuholm, 2010-01-27

5 answers

Conozco al menos dos.

  • Usted debe tener el control de la asignación. No es uno grande en realidad, pero algunas api más antiguas les gusta devolver punteros que debe eliminar.
  • No hay deleter personalizado. No se por qué esto no es compatible, pero no lo es. Eso significa que sus punteros compartidos tienen que usar un deleter vainilla.

Puntos bastante débiles. así que intenta usar siempre make_shared.

 26
Author: deft_code,
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
2010-01-27 14:40:37

Además de los puntos presentados por @deft_code, uno aún más débil:

  • Si usa weak_ptrs que viven después de que todos los shared_ptrs de un objeto dado hayan muerto, entonces la memoria de este objeto vivirá en memoria junto con el bloque de control hasta que el último weak_ptr muera. En otras palabras, el objeto es destruido pero no desasignado hasta que el último weak_ptr es destruido.
 38
Author: sbk,
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
2011-12-06 16:03:51

De http://www.codesynthesis.com / ~boris / blog/2010/05/24/smart-pointers-in-boost-tr1-cxx-x0/

El otro inconveniente de la implementación make_shared () es el aumento en el tamaño del código objeto. Debido a la forma en que se implementa esta optimización, se creará una instancia de una tabla virtual adicional, así como un conjunto de funciones virtuales para cada tipo de objeto que use con make_shared().

 14
Author: Viktor Sehr,
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
2011-05-10 21:43:17

Además, make_shared no es compatible con el patrón de fábrica. Esto se debe a que la llamada a make_shared dentro de su función factory llama al código de la biblioteca, que a su vez llama a new, al que no tiene acceso, ya que no puede llamar al constructor(es) privado (es) de la clase (el constructor (es) debe ser privado, si sigue el patrón de fábrica correctamente).

 8
Author: Rok Strniša,
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
2013-03-04 13:50:34

Con make shared no se puede especificar cómo se hará la asignación y la desasignación del objeto retenido.

Cuando se desee, use std::allocate_shared<T> en su lugar:

std::vector<std::shared_ptr<std::string>> avec; 
std::allocator<std::string> aAllocator;
avec.push_back(std::allocate_shared<std::string>(aAllocator,"hi there!"));

Tenga en cuenta que el vector no necesita ser informado sobre el asignador!

Para hacer un asignador personalizado, echa un vistazo aquí https://stackoverflow.com/a/542339/1149664

 7
Author: Johan Lundberg,
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
2017-05-23 11:54:39