Стандартный контейнер boost :: shared_ptr - PullRequest
6 голосов
/ 26 сентября 2008

Предположим, у меня есть класс 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? Я почти уверен, что так и будет, но я подумал, что стоит спросить / поделиться.

Ответы [ 3 ]

7 голосов
/ 26 сентября 2008

Во-первых, заголовок вашего вопроса говорит boost :: auto_ptr, но вы на самом деле имеете в виду boost :: shared_ptr

И да, исходный указатель будет освобожден (если на него больше нет общих ссылок).

1 голос
/ 26 сентября 2008

Зависит от того, что происходит в вашем ... разделе

Ваш контейнерный класс содержит копий экземпляров foo_sp, когда вы выполняете m[0] = p2; копия p, которая изначально находилась в этом месте, выходит за рамки. В это время он будет удален , если нет других ссылок foo_sp на него .

Если копия, которая была объявлена ​​во второй строке foo_sp p(new foo);, все еще существует, память не будет освобождена. Запись будет удалена после удаления всех ссылок на нее.

0 голосов
/ 26 сентября 2008

Поскольку stackoverflow не позволяет мне комментировать, я просто отвечу. : /

Я не вижу выхода "p" из области видимости, поэтому объект, на который он указывает, не будет освобожден «р» все равно будет указывать на него.

...