Pergunta

No meu projeto atual estou usando boost::shared_ptr bastante extensa.

Recentemente meus companheiros companheiros também começaram usando weak_ptr. Eu não sei qual usar e quando.

Além disso, o que eu devo fazer se deseja converter weak_ptr para shared_ptr. Será que colocar um cadeado na weak_ptr para criar uma shared_ptr afetar meu código em outro segmento?

Foi útil?

Solução

Em geral e resumo,

ponteiros fortes garantir a sua própria validade. Use-os, por exemplo, quando:

  • Você possui o objeto que está sendo apontada; criá-lo e destruí-lo
  • Você não definiu comportamento se o objeto não existe
  • Você precisa impor que o objeto existe.

ponteiros fracos garantia sabendo sua própria validade. Use-os, por exemplo, quando:

  • Você acessá-lo, mas não é seu.
  • Você definiu comportamento se o objeto não existe

Lock () em um ponteiro fraco retorna um ponteiro forte; isto é como você acessar o ponteiro fraco. Se o objecto não é mais válido (que tem sido eliminado, etc), então o ponteiro forte será nulo, de outra forma, ele irá apontar para o objecto. Você terá que verificar isso.

É configurado dessa maneira para que você não pode excluir acidentalmente o objeto enquanto você estiver usando, porque você fez um ponteiro temporário (local) forte, e, portanto, garunteed existência do objeto, enquanto que a forte restos ponteiro. Quando você terminar de usar o objeto, geralmente você deixar o ponteiro forte ficarem fora do escopo (ou a reatribuição-lo), o que permite que o objeto a ser excluído. Para multithreading, tratá-los com o mesmo cuidado que você tratar outras coisas que não têm built-in de segurança do thread, observando que a garantia que eu mencionei acima irá espera quando multithreading. AFAIK eles não fazem nada de especial além disso.

o impulso compartilhado ponteiros também têm coletor de lixo como características, uma vez que quando o último forte ponteiro para um objeto vai embora ou pontos em outro lugar, o objeto é excluído.

Há também o desempenho e dependências circulares mencionado em outras respostas.

No fundo, eu diria que o impulso biblioteca compartilhada ponteiro permite que você não estragar montar um programa, mas não é nenhum substituto para tomar o tempo para projetar corretamente seus ponteiros, posses de objetos e vidas. Se você tem uma tal concepção, você pode usar a biblioteca para aplicá-la. Se você não tem uma tal concepção, é provável que você executar em problemas diferentes do que antes.

Outras dicas

Use weak_ptr quando os objetos criados conter referências cíclicas, ou seja shared_ptr para um objeto com uma volta shared_ptr para si mesmo. Isso ocorre porque shared_ptr não pode lidar com referências cíclicas - quando ambos os objetos saem do âmbito, os meios de referenciação mútua que eles não são "lixo coletado", por isso a memória é perdida e você tem um vazamento de memória. Desde weak_ptr não aumenta a contagem de referência, o problema de referência cíclica não ocorre. Isto também significa em geral que, se você só quer tomar um ponteiro para algo que é referência contados e não quer aumentar sua contagem de referência, em seguida, usar weak_ptr.

Caso contrário, você pode usar shared_ptr.

Para obter mais informações, verifique o impulso documentação .

ponteiros compartilhados implementar a contagem de referência, ponteiros fracos não afetam a contagem de referência e se você não tem ponteiros compartilhados para um objeto, ponteiros única fracos, o objeto é excluído e os ponteiros fracos agora dizer-lhe que o objeto foi perdido .

Há duas razões para usar um ponteiro fraco:

  1. Para eliminar o custo de referência aumento contagem / diminuição; no entanto você não deve fazer isso porque é propenso a erros e realmente não poupar muito tempo
  2. em estruturas de dados para contabilidade, v.g. você tem um índice de todos os objetos Foo que estão "vivos", ou seja, utilizado em outro lugar, e você não quer manter uma Foo vivo no índice se todos os usos "reais" ter terminado. Este é o caso de uso realista básica para ponteiros fracos. Claro que existem outros também.

Assim, em geral, a minha recomendação seria a utilização de ponteiros fracos somente quando você sabe que você quer deixar os objetos referenciados ser excluído e deseja detectar isso. Em outros casos, usar ponteiros compartilhados (contagem de referência), ou ponteiros diretos, esp. No método variáveis ??locais quando se sabe que os objetos não vão ficar excluído. Também errorprone, porém, mas mais rápido do que os ponteiros compartilhado.

NB. objetos cíclicas não precisa ponteiros fracos, você pode usar ponteiros não-cozidos, regulares, em vez na maioria dos programas de construção adequada. ponteiros fracos menos arriscado, no entanto.

Você provavelmente não deve estar tentando usar ponteiros fracos a menos que você está tentando implementar um coletor de lixo, que não é uma idéia quente em C ++, porque é muito difícil manter o controle de tudo o que poderia dar errado de perto o suficiente.

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