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 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.

O que não é muito claro para mim. É um ponteiro forte equivalente a um ponteiro partilhado (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.

Basicamente, estou a tentar decifrar o código. http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html E realmente não entendo o uso de 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.

Author: Onik, 2013-03-19

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.

 8
Author: Gabe Sechan, 2013-03-18 20:52:27
Sp significa StrongPointer em Android, a memória ocupada pelo objeto pontiagudo será liberada se a contagem de referência for igual a 0. wp significa ponto fraco, por isso se eu tiver um ponto fraco, não me interessa se o objecto referenciado está vivo ou não. Pode ser usado em alguns cenários de cache e comparação. Primeiro, dê uma olhada rápida na implementação do sp em StrongPointer.h.

É 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.

 27
Author: StarPinkER, 2013-03-19 06:05:12

Este é um bom post discutindo a diferença entre referência regular ( ou "StrongReference"), SoftReference s, WeakReference s, e mesmo PhantomReferences em Java, desfrute: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

 2
Author: Emil Davtyan, 2013-03-18 20:56:24