Pergunta

Suponha que eu tenho um foo classe, e deseja usar um std :: mapa para armazenar alguns boost :: shared_ptrs, por exemplo:.

class foo;

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

foo_sp_map m;

Se eu adicionar um novo foo_sp ao mapa, mas a chave já utilizadas existe, será a entrada existente ser eliminado? Por exemplo:

foo_sp_map m;

void func1()
{
    foo_sp p(new foo);
    m[0] = p;
}

void func2()
{
    foo_sp p2(new foo);
    m[0] = p2;
}

Será que o ponteiro de origem (p) ser liberado quando ele é substituído por p2? Tenho certeza que vai ser, mas eu pensei que era pena perguntar / partilha.

Foi útil?

Solução

Em primeiro lugar, o seu título da pergunta diz boost :: auto_ptr, mas você impulso realmente média :: shared_ptr

E sim, o ponteiro original será libertado (se não há mais compartilhada referências a ele).

Outras dicas

Depende do que acontece em sua ... seção

Sua classe recipiente contém cópias de instâncias de foo_sp, quando você executar m[0] = p2; a cópia do p que era originalmente naquele lugar sai do escopo. Naquele tempo ele será excluído se houver nenhum outro foo_sp se refere a ele .

Se a cópia que foi declarado na segunda foo_sp p(new foo); linha ainda está por aí, em seguida, a memória não será desalocada. A entrada será de exclusão, uma vez todas as referências a ele foram removidas.

Desde stackoverflow não me permite comentário, eu vou responder. : /

Eu não vejo "p" sair do escopo, de modo que o objeto apontado por ele irá não ser libertado. "P" ainda irá apontar para ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top