Se necesitan para asegurarse de que no inicializa ambos objetos shared_ptr con el mismo puntero cruda, o se eliminarán dos veces. Un (pero sigue siendo malo) mejor manera de hacerlo:
classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);
// or shared_ptr<classA> my_ptr = raw_ptr;
// ...
shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;
ADVERTENCIA: el código anterior muestra las malas prácticas! raw_ptr
simplemente no debería existir como una variable. Si inicializa directamente sus punteros inteligentes con el resultado de new
, reduce el riesgo de inicializar accidentalmente otros punteros inteligentes de forma incorrecta. Lo que debe hacer es:
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
Lo bueno es que el código es más concisa también.
EDITAR
Probablemente debería elaborar sobre cómo funcionaría con un mapa. Si tuviera un puntero sin procesar y dos mapas, podría hacer algo similar a lo que mostré arriba.
unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;
shared_ptr<classA> my_ptr(new classA);
my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!
Don; t exponer el puntero sin formato en una variable. Al hacer eso, le da a un mantenedor una oportunidad más fácil de arruinar y colocar el puntero RAW en otro puntero compartido. Solo use 'my_ptr (new ClassA());' De esa manera un mantenedor tiene que hacer un trabajo extra para arruinar las cosas. –
@Martin York Estaba editando para incluir un punto al respecto; Añadiré una nota más explícita. Pero estás en lo cierto. :) – Dawson
'// o shared_ptr my_ptr = raw_ptr;' está mal en 'std :: shared_ptr', porque debe ser explícito como' // o shared_ptr my_ptr (raw_ptr); '. –
Justme0