Ответ 1
Вам нужно убедиться, что вы не инициализируете оба объекта shared_ptr одним и тем же необработанным указателем, или он будет удален дважды. Лучше (но все еще плохой) способ сделать это:
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;
ПРЕДУПРЕЖДЕНИЕ: приведенный выше код показывает плохую практику! raw_ptr
просто не должен существовать как переменная. Если вы непосредственно инициализируете свои интеллектуальные указатели с результатом new
, вы уменьшите риск случайной инициализации других интеллектуальных указателей неправильно. Что вам нужно сделать:
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
Хорошо, что код также более краткий.
ИЗМЕНИТЬ
Я должен, вероятно, подробно остановиться на том, как он будет работать с картой. Если у вас был необработанный указатель и две карты, вы могли бы сделать что-то похожее на то, что я показал выше.
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!