Подтвердить что ты не робот

Создание shared_ptr из необработанного указателя

У меня есть указатель на объект. Я хотел бы сохранить его в двух контейнерах, которые имеют право собственности. Поэтому я думаю, что было бы хорошо сделать его shared_ptr из С++ 0x. Как преобразовать необработанный указатель на shared_pointer?

typedef unordered_map<string, shared_ptr<classA>>MAP1;
MAP1 map1;
classA* obj = new classA();
map1[ID] = how could I store obj in map1??

Спасибо

4b9b3361

Ответ 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!

Ответ 2

Вы можете использовать различные способы, но reset() будет хорошо:

map1[ID].reset(obj);

И для решения проблемы наличия двух карт обратитесь к одному и тому же shared_ptr, мы можем иметь:

map2[ID] = map1[ID];

Обратите внимание, что трюк вообще, чтобы избежать двойного удаления, состоит в том, чтобы попытаться вообще избежать указателей на raw. Следовательно, избегайте:

classA* obj = new classA();
map1[ID].reset(obj);

но вместо этого добавьте новый объект кучи в shared_ptr.