Вопрос

Предположим, у меня есть класс 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» все равно будет указывать на это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top