C ++ é tudo sobre propriedade de memória - também conhecida como semântica de propriedade .
É responsabilidade do proprietário de um pedaço de memória alocada dinamicamente liberar essa memória. Portanto, a questão realmente é quem é o dono da memória.
Em C ++, a propriedade é documentada pelo tipo em que um ponteiro bruto é envolvido, portanto, em um bom programa C ++ (IMO), é muito raro ( raro , não nunca ) ver ponteiros não processados passados (pois os ponteiros não têm propriedade inferida, portanto, podemos não dizer a quem pertence a memória e, portanto, sem uma leitura cuidadosa da documentação, você não pode dizer quem é o responsável pela propriedade)
Por outro lado, é raro ver ponteiros não processados armazenados em uma classe. Cada ponteiro bruto é armazenado em seu próprio invólucro de ponteiro inteligente. ( NB: Se você não possui um objeto, não deve armazená-lo porque você não pode saber quando ele sairá do escopo e será destruído.)
Então a pergunta:
- Que tipo de semântica de propriedade as pessoas encontraram?
- Quais classes padrão são usadas para implementar essa semântica?
- Em que situações você os considera úteis?
Vamos manter 1 tipo de propriedade semântica por resposta para que possam ser votadas individualmente.
Resumo:
Conceitualmente, os ponteiros inteligentes são simples e uma implementação ingênua é fácil. Tenho visto muitas tentativas de implementação, mas invariavelmente elas são interrompidas de alguma forma que não é óbvia para o uso casual e exemplos. Portanto, eu recomendo sempre usar ponteiros inteligentes bem testados de uma biblioteca ao invés de rolar seus próprios. std::auto_ptr
ou uma das dicas inteligentes Boost parece cobrir todas as minhas necessidades.
std::auto_ptr<T>
:
Uma única pessoa possui o objeto. A transferência de propriedade é permitida.
Uso: permite definir interfaces que mostram a transferência explícita de propriedade.
boost::scoped_ptr<T>
Uma única pessoa possui o objeto. A transferência de propriedade NÃO é permitida.
Uso: usado para mostrar propriedade explícita. O objeto será destruído pelo destruidor ou quando explicitamente redefinido.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Propriedade múltipla. Este é um ponteiro de contagem de referência simples. Quando a contagem de referência chega a zero, o objeto é destruído.
Uso: Quando um objeto pode ter várias flores com uma vida útil que não pode ser determinada em tempo de compilação.
boost::weak_ptr<T>
:
Usado com shared_ptr<T>
em situações em que pode ocorrer um ciclo de ponteiros.
Uso: Usado para impedir que os ciclos retenham objetos quando apenas o ciclo está mantendo um refcount compartilhado.