Подтвердить что ты не робот

Что такое сильные указатели и слабые указатели

Я путаюсь с понятием "сильный указатель" и "слабый указатель". Сама Диана Хакборн сказала, что:

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

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

Update:

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

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

Update:

Фактический ответ заключается в комментариях принятого ответа. Благодаря Габе Сечану:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

sp означает 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;
}

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

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

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