стандартный контейнер boost::shared_ptr
-
02-07-2019 - |
Вопрос
Предположим, у меня есть класс 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.
И да, исходный указатель будет освобожден (если на него больше нет общих ссылок).
Другие советы
Это зависит от того, что происходит в вашем...раздел
Ваш класс контейнера содержит копии экземпляров foo_sp при выполнении m[0] = p2;
копия p
то, что изначально было в этом месте, выходит за рамки.В это время он будет удален если нет других, foo_sp ссылается на него.
Если копия, объявленная во второй строке foo_sp p(new foo);
все еще существует, то память не будет освобождена.Запись будет удалена после удаления всех ссылок на нее.
Поскольку stackoverflow не позволяет мне комментировать, я просто отвечу.:/
Я не вижу, чтобы "p" выходил за пределы области видимости, поэтому объект, на который он указывает, будет нет быть освобожденным.«p» все равно будет указывать на это.