¿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.
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.
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_ptr
s que viven después de que todos losshared_ptr
s 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 últimoweak_ptr
es destruido.
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().
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).
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
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