2017-02-09 1 views
0

내가 Refbase.h, Refbase.cpp 강한 포인터의 안드로이드 구현에서 StrongPointer.h안드로이드 네이티브 강력한 포인터 :: shared_ptr의

말하는 겁니다, 어떤 강한 포인터 기반의 객체는 상속 할 필요가 refbase 즉

sp<TheClass> theObj // TheClass must inherit from class RefBase 

이 요구 사항은 sp의 방법 중 하나의 코드에서 볼 수있다 :

template<typename T> sp<T>& sp<T>::operator =(T* other) { 
    if (other != NULL) { 
     other->incStrong(this); 
    } 
    if (mPtr != NULL) { 
     mPtr->decStrong(this); 
    } 
    mPtr = other; 
    return *this; 
} 

에서 incStrong 또는 decStrong에 대한 호출 주문이 실패하지 않도록하십시오. . . othermPtrRefBase을 상속해야합니다

질문

sp이 구현 등이 관리는 을 필요 년대 obj가 RefBase의 자녀가 될 것을? 컴파일 타임이나 심지어 런타임에서도이 요구 사항을 시행 할 방법조차 없습니다. (글쎄, 아마 if(type()...) 더 생각하면

Std library doesn't have such a requirement

...
이 유연성을 제공하는 대답은?
예인 경우 어떻게 유연성을 제공합니까?

답변

0

메모리 할당을 절약합니다. 당신이 쓸 때 :

std::shared_ptr<Foo> pFoo{new Foo(bar)}; 

pFoo을 실제로 참조 카운터가 있습니다 (힙에 할당) 공유 데이터 구조에 대한 포인터, 실제 푸 객체에 대한 포인터를 가지고있다. 객체를 RefBase에서 파생 시키면 참조 카운트를 객체 자체에 포함 할 수 있습니다 (추가 메모리 할당 저장).

흥미롭게도 C++ 11 이상에서는 std::make_shared<Foo>을 사용하여 추가 메모리 할당을 피할 수 있습니다.이 메모리 할당은 단일 메모리 할당을 수행하고 공유 데이터 구조와 Foo 객체를 구성합니다.

컴파일 시간이 없기 때문에 유도의 확인은 RefBase에서 부주의합니다. m_ptrRefBase *m_ptr으로 신고되어야하고 operator * (등)은 T*에 static_cast를 수행해야합니다. 사실 sp<T>은 비교 연산자가 public이고 다른 함수가 protected로 상속 된 sp_base을 상속 받았을 것입니다. 제 생각에

편집

컴파일 타임 꽤 검사있다. TincStrong 구성원이 없으면 컴파일이 실패하고 에서 파생되지 않는 한 거의이 확실하지 않습니다. 나는 여전히 T*RefBase*으로 변환하는 것이 보다 좋았을 것이라고 생각하는데, 체크가 더 좋을지 모르지만 그 중 하나가 아마도 충분할 것입니다.

+2

당신의 예제가'shared_ptr'에 대해 합당한가? [할당 연산자는 특별한 포인터 만 취합니다.] (http://www.cplusplus.com/reference/memory/shared_ptr/operator=/) 클래스'sp'의 경우 ** 할당은 ** 합법입니다. – Adrian

+0

할당 연산자가 표시되지 않습니다. 초기화를 보여 줬습니다. shared_ptr을 사용하여 과제를하려면 'pFoo = shared_ptr (new Foo (bar));' –

+0

... '이 있어야하며 이는 침입 포인터의 또 다른 이점입니다. (그리고 당신은'shared_from_this'와 함께 바보 같은 게임을 할 필요가 없습니다). –

0

RefBase를 구현하는 모든 개체에서 sp를 자동으로 만들 수 있지만 공유 포인터의 경우 원시 포인터를 공유 된 것으로 랩핑하는 동안 발에서 자신을 쏠 수 있습니다.

그래서 shared_ptr을 위해이 필요할 수 있습니다 동안 : SP에 대한 http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

는 거의 안전하게 SP의 생성자에 원시 포인터를 전달할 수 있습니다.

관련 문제