2008-09-26 8 views
6

Предположим, у меня есть класс Foo, и хотите использовать зЬй :: карта для хранения некоторых подталкивания :: shared_ptrs, например:повышение :: shared_ptr стандартный контейнер

class foo; 

typedef boost::shared_ptr<foo> foo_sp; 
typeded std::map<int, foo_sp> foo_sp_map; 

foo_sp_map m; 

Если добавить новый foo_sp к map, но используемый ключ уже существует, удаляется ли существующая запись? Например:

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

+0

Измененный вопрос - должен быть shared_ptr не auto_ptr, – Rob 2008-09-26 15:02:02

+0

Это должно быть «должно быть» – 2011-11-17 10:30:24

ответ

7

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

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

0

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

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

1

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

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

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