programing

강한 포인터와 약한 포인터는 무엇입니까?

bestprogram 2023. 10. 14. 10:25

강한 포인터와 약한 포인터는 무엇입니까?

저는 "강한 포인터"와 "약한 포인터"라는 개념에 혼란스럽습니다.다이앤 핵본 자신은 이렇게 말했습니다.

오브젝트는 강력한 포인터가 있는 동안 주변에 남아 있습니다. 마지막 포인터가 해제되면 소멸됩니다.약한 포인터로 할 수 있는 것은 비교와 강한 포인터로 승격을 시도하는 것뿐입니다. 오브젝트에 다른 강한 포인터가 없으면 후자는 실패합니다.

그것은 나에게 꽤 불분명합니다.가까)와 같습니까? (boost::공유 포인터?그리고 단지 강력한 포인터로 자신을 홍보하려는 시도가 있다면 약한 포인터의 역할은 무엇일까요?약하고 강한 포인터가 필요할 때가 언제일까요?

업데이트:

의 커널 만인 에 sp그리고.wp , .

기본적으로 저는 여기 http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html 에서 암호를 해독하려고 노력하고 있습니다. 그리고 실제로는 사용법을 이해하지 못합니다.sp그리고.wp

업데이트:

실제 답변은 수락된 답변의 코멘트에 있습니다.게이브 세찬 씨 덕분입니다.

강한 포인터와 약한 포인터는 서로 다른 스마트 포인터 구현이며, 포인터가 범위를 벗어나면 적어도 하나의 강한 포인터가 참조하는 한 해제되지 않습니다.약한 포인터(또는 아무것도 참조하지 않는 경우)만 참조됩니다.검사는 강한 참조 또는 약한 참조가 생략될 때마다 수행됩니다.

만약 내가 같은 물체를 가리키는 약한 포인터 10개를 가지고 있는데, 그 10개 중 하나가 범위를 벗어나면, 그 물체는 파괴될 것입니까?반면 강력한 포인터를 사용하면 10개가 모두 범위를 벗어나야 물체가 파괴됩니까?

네, 거의.만약 당신이 가진 것이 약한 포인터 10개뿐이라면, 그것은 아마도 마지막 강한 포인터가 범위를 벗어났을 때 이미 범위를 벗어났을 것입니다.구현을 통해 여유 메모리가 있으면 메모리가 조금 더 오래 남아있을 수도 있지만 메모리 부족 상태에 들어가면 잘릴 것이고 그녀의 인용문에서 그들의 구현이 그렇게 발전된 것 같지는 않습니다.그리고 이것의 용도는 여전히 주로 캐싱입니다. 이는 boost shared_ptr 및 boost weak_ptr와 거의 맞먹습니다.그래서 기본적으로, 약한 포인터는 참조하는 물체를 언제든지 사라지게 할 수 있습니다.

sp는 Android에서 StrongPointer를 의미하며 참조 횟수가 0과 같으면 참조 개체가 차지한 메모리가 해제됩니다. wp는 WakenPointer를 의미하므로 참조된 개체가 살아 있는지 여부는 상관 없습니다.일부 캐시 및 비교 시나리오에서 사용될 수 있습니다.

먼저 StrongPointer.h의 sp 구현에 대해 간단히 살펴봅니다.

그것은 단순히 참조 계산을 위한 포장지일 뿐입니다.예를들면,

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에서 관리하는 개체의 경우 일부 Strong Pointers와 Wak Pointers가 동시에 참조할 수 있습니다.

Android 프레임워크에서 StrongPoint가 널리 사용되는 것을 볼 수 있는데, 대부분 IBinder 객체에 있으며, 네이티브 바인더 객체는 다양한 프로세스를 통과할 수 있습니다.프로세스에 따라 동일한 개체에 대한 강력한 포인터를 유지할 수 있으며, 하나의 프로세스가 포인터를 유지하는 한 시스템에서 개체가 취소되지 않습니다.

안드로이드는 C가 아닌 자바로 프로그래밍되도록 되어있습니다.Android 팀의 모든 문서는 해당 언어를 참조할 것입니다.자바에는 강한 참조와 약한 참조가 있습니다.약한 참조는 쓰레기 수거원이 청소하는 것을 막지 못하고 강한 참조는 합니다.일부 OS에서 캐싱에 사용되지만 3.0 현재 Android에서는 개체에 대한 약한 참조만 가지고 있기 때문에 개체가 즉시 수집됩니다.

C에는 가비지 컬렉션이 없으므로 약한 참조와 동등한 것이 없습니다.

참조 ( "StrongReference") 의입니다 입니다.SoftReferences,WeakReferences, 심지어는PhantomReferences in Java, 즐겨보세요: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

언급URL : https://stackoverflow.com/questions/15486676/what-are-strong-pointers-and-weak-pointers