boost :: shared_ptr contêiner padrão
-
02-07-2019 - |
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.
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.