2013-03-18 4 views
20

Я смущен понятием «сильный указатель» и «слабый указатель». Дайан Хакборн сама сказала, что:Что такое сильные указатели и слабые указатели

Объект останется вокруг, пока есть сильные указатели; это уничтожено после выпуска последнего. Все, что вы можете сделать со слабым указателем , - это сравнение и попытка продвигать сильный указатель; последний не удастся, если нет других сильных указателей на объекте .

Это совершенно неясно. Является ли сильный указатель эквивалентным (boost::) общим указателем? И какова роль слабого указателя, если он просто пытается продвинуть себя к сильному указателю? Например, когда нам нужны слабые и сильные указатели?

Update:

Спасибо всем, но я спрашиваю конкретно о ядре sp и wp андроида, и они не имеют ничего общего со ссылками Java на всех.

В основном я пытаюсь взломать код здесь http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html И действительно не понимаю использования sp и wp

Update:

Фактический ответ лежит в комментариях принятого ответ. Благодаря Gabe Sechan:

Сильные и слабые указатели различных реализаций смарт-указатель и делать то же thing-, когда указатель выходит из области видимости, так долго как по крайней мере один сильный указатель ссылки него не будет быть освобожденным. Если только слабые указатели (или ничего) ссылок, то это будет. Проверка выполняется всякий раз, когда проскальзывает сильная или слабая ссылка на нее.

если у меня есть 10 слабых указателей, ссылающихся на один и тот же объект, и один из те 10 выходит за пределы области, объект будет уничтожен? В то время как с сильными указателями, только если все 10 из них выйдут из сферы действия, будет уничтожен объект ?

Да, почти. Если у вас всего 10 слабых указателей, вероятно, уже вышли из сферы действия, когда последний сильный указатель вышел области. Реализация может позволить ему придерживаться немного , пока дольше, если есть запасная память, но она будет измельчена, если вы перейдете в состояние низкой памяти, и это не похоже на то, что реализация - это продвинутая из ее цитаты. И использование этого по-прежнему в основном кэширование - это примерно эквивалентно boost shared_ptr и boost weak_ptr. Таким образом, в основном, слабый указатель может иметь объект , он ссылается в любой момент.

+0

+1 для усилий, чтобы объяснить эту концепцию – miller

ответ

7

Android предназначен для программирования на Java, а не C. Любая документация из команды Android будет ссылаться на этот язык. В Java есть сильные и слабые ссылки.Слабая рекомендация не мешает сборщику мусора очищать его, что очень важно. Они используются для кеширования на некоторых операционных системах, но на Android от 3.0, содержащих только слабые ссылки на объект, он будет немедленно собран.

C не имеет эквивалента слабой ссылки, так как он не содержит сбор мусора.

+4

На самом деле я программирую ядро ​​андроида, поэтому никакой Java, спасибо в любом случае. –

+5

Тогда вас не должно интересовать Слабые или сильные ссылки :-) – fedepaol

+0

@fedepaol избил меня ... – Simon

22

зр означает StrongPointer в Android, то память, занятая указанным объектом, будет освобождена, если счетчик ссылок равен 0. wp означает WeakPointer, поэтому, если у меня есть слабый указатель, мне все равно, жив ли объект ссылки. Он может использоваться в некоторых сценариях кеша и сравнения.

Во-первых, быстро посмотрите на реализацию sp в StrongPointer.h.

Это просто обертка для подсчета ссылок. Например,

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; 
} 

Если вы создаете Strong указатель на sp<IBinder> strongPointer, то m_ptr является объект ссылки. Как вы можете видеть в исходном коде, шаблон sp только представляет собой сильный указатель, так что система не освободит память, пока я держу этот sp. Он не поддерживает контрольный счетчик. Счетчик поддерживается в классе RefBase. И чтобы использовать StrongPointer, ваш объект должен быть экземпляром RefBase.

Класс RefBase поддерживает как сильный опорный счетчик, так и слабый опорный счетчик, единственное отличие заключается в том, что ссылочный объект будет освобожден, если сильный показатель равен 0. Более того, для объекта, управляемого Refbase, на него могут ссылаться некоторые сильные указатели и Слабые указатели одновременно.

Вы можете широко использовать StrongPointers в платформе Android, большинство из которых находятся на объекте IBinder, собственный объект связывания может проходить через различные процессы. Различные процессы могут содержать сильные указатели на один и тот же объект, объект не будет отменен системой, пока один процесс все еще удерживает указатель.

+0

Почему класс 'sp' не поддерживает ссылочный счет, как это делает' std :: shared_pointer'? В чем преимущество разделения обязанностей, подобных этому? – Adrian

+0

Это должно быть отмечено как ответ ... –

Смежные вопросы