Предположим, у меня есть класс foo, и я хочу использовать std :: map для хранения некоторого boost :: shared_ptrs, например:
class foo;
typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;
foo_sp_map m;
Если я добавлю на карту новый foo_sp, но используемый ключ уже существует, будет ли удалена существующая запись? Например:
foo_sp_map m;
void func1()
{
foo_sp p(new foo);
m[0] = p;
}
void func2()
{
foo_sp p2(new foo);
m[0] = p2;
}
Освободится ли исходный указатель (p) при его замене на p2? Я почти уверен, что так и будет, но я подумал, что стоит спросить / поделиться.





Во-первых, в заголовке вашего вопроса написано boost :: auto_ptr, но на самом деле вы имеете в виду boost :: shared_ptr
И да, исходный указатель будет освобожден (если на него больше нет общих ссылок).
Поскольку stackoverflow не позволяет мне комментировать, я просто отвечу. : /
Я не вижу, чтобы "p" выходила за пределы области видимости, поэтому объект, на который он указывает, будет освобожден нет. "p" по-прежнему будет указывать на него.
Я должен был прояснить, что p будет вне области действия к моменту создания p2.
Ограничение на комментирование новых пользователей заключается в том, чтобы запретить новым пользователям оставлять комментарии, а не для того, чтобы побудить вас обойти систему!
Это зависит от того, что происходит в вашем разделе ...
Ваш контейнерный класс содержит копии экземпляров foo_sp, когда вы выполняете m[0] = p2;, копия p, которая изначально находилась в этом месте, выходит за пределы области видимости. В это время будет удален если нет других foo_sp ссылается на него.
Если копия, объявленная во второй строке foo_sp p(new foo);, все еще существует, память не будет освобождена. Запись будет удалена после удаления всех ссылок на нее.
Измененный вопрос - должен был быть shared_ptr, а не auto_ptr,