O que são ponteiros fortes e ponteiros fracos
estou confuso com a noção de "ponteiro forte" e "ponteiro fraco". A própria Diane Hackborn disse isso:
O que não é muito claro para mim. É um ponteiro forte equivalente a um ponteiro partilhado (O objecto permanecerá em redor enquanto houver ponteiros fortes; é destruído assim que o último for libertado. Tudo o que podes fazer com um fraco ponteiro é Comparação e tentativa de promover a um ponteiro forte; o último falhará se não houver outros pontos fortes sobre o objecto.
boost::
? E qual é o papel de um ponteiro fraco se ele existe apenas para tentar promover-se a um ponteiro forte? Quando é que precisamos de indicadores fracos e fortes?
actualizar:
obrigado a todos, mas estou a perguntar especificamente sobre o kernel do android sp
e wp
, e eles não têm nada a ver com as referências do Java.
sp
e wp
actualizar:
A verdadeira resposta está nos comentários da resposta aceite. Graças ao Gabe Sechan.ponteiros fortes e fracos são diferentes implementações de ponteiros inteligentes e fazer a mesma coisa-quando um ponteiro sai do escopo, por tanto tempo como pelo menos uma referência de ponteiro forte não será livrar. Se apenas apontadores fracos (ou nada) referências que será. O cheque é feito sempre que uma referência forte ou fraca a ele é descoped.
Se eu tiver 10 ponteiros fracos a referenciarem o mesmo objecto, e um dos se esses 10 saem do alcance, o objecto será destruído? Considerando o seguinte: ponteiros fortes, só quando todos os 10 deles saírem do alcance é que o objecto destruído? Sim, quase. Se tudo o que você tem são 10 pontos fracos, provavelmente saíram do âmbito de Aplicação já, quando o último ponteiro forte saiu de âmbito. A implementação pode permitir-lhe ficar por aqui um pouco enquanto mais tempo se houver memória, mas será cortado se você for em estado de baixa memória e não parece a implementação é muito avançada, segundo a sua citação. E o uso disto é ainda principalmente caching-é aproximadamente equivalente a um boost shared_ptr e aumentar o weak_ptr. Então, basicamente, um ponteiro fraco pode ter o objecto as referências desaparecem em qualquer tempo.
3 answers
O Android está programado para ser programado em Java, não C. qualquer documentação da equipa do Android referiria essa linguagem. Em Java há referências fortes e fracas. Uma referência fraca não impede o coletor de lixo de limpá-lo, uma forte referência faz. Eles são usados para cache em alguns OSes, mas no Android a partir de 3.0 segurando apenas referências fracas a um objeto significa que ele será coletado imediatamente.
C não tem equivalente a uma referência fraca, uma vez que não tem recolha.
É simplesmente um invólucro para a contagem de referência. Por exemplo,
template<typename T> template<typename U>
sp<T>& sp<T>::operator = (U* other)
{
if (other) ((T*)other)->incStrong(this);
if (m_ptr) m_ptr->decStrong(this);
m_ptr = other;
return *this;
}
Se você cria um ponteiro forte por sp<IBinder> strongPointer
, o m_ptr é o objecto referenciado. Como você pode ver no código fonte, o modelo sp representa apenas um ponteiro forte para que o sistema não libere a memória enquanto eu segurar este sp. Não mantém um contador de referências. O contador é mantido na classe RefBase . E para usar o StrongPointer, o seu obj precisa ser um exemplo de Refase.
A classe RefBase mantém tanto um contador de referência forte como um contador de referência fraco., a única diferença é que o objeto referenciado será libertado se o forte conta para 0. Além disso, para um objeto gerenciado pela Refbase, ele pode ser referenciado por alguns ponteiros fortes e ponteiros fracos simultaneamente.
Você pode ver uma ampla utilização de pontos fortes em Framework Android, a maioria deles estão em objeto IBinder, um objeto binder nativo pode passar por diferentes processos. Diferentes processos podem conter ponteiros fortes para um mesmo objeto, o objeto não será revogado pelo sistema desde que um o processo ainda está segurando o ponteiro.
Este é um bom post discutindo a diferença entre referência regular ( ou "StrongReference"), SoftReference
s, WeakReference
s, e mesmo PhantomReference
s em Java, desfrute:
http://weblogs.java.net/blog/2006/05/04/understanding-weak-references