2010-04-26 4 views
17

인가 등없음 조합의 역할 당기 :: shared_ptr의

나는 그것을 작성하는 매우 사소한 건 알지만 난 몰라 이미 사용할 수있는 작은 함수가 있으면 코드를 뿌리려고합니다.

+4

개체를 파괴 할 필요가없는 경우 왜 처음에 shared_ptr에 넣는 것입니까? –

+5

스마트 포인터를 사방에 놓고 'shared_ptr'이 필요한 함수에 스택 또는 멤버 변수를 전달하려는 경우 매우 편리합니다. –

+1

@ 마크 랜섬 (Mark Ransom) : 당신은 제가 저주를 들게하는 코드베이스를 생각하게 만듭니다. : P –

답변

10

예 여기에서있다 :

#include <boost/serialization/shared_ptr.hpp> // for null_deleter 

class Foo 
{ 
    int x; 
}; 

Foo foo; 
boost::shared_ptr<Foo> sharedfoo(&foo, boost::serialization::null_deleter()); 

있다, 물론, 그것으로 당신이 나중에 사용하기 위해 shared_ptr을 저장하지 않습니다 전화 기능을 알 필요가 있다는 사실에 위험이 사실을 기본 객체가 shared_ptr의 마지막 인스턴스까지 유효하다는 점에서 shared_ptr의 정책을 위반합니다.

+0

보이는 것처럼 가까이 있습니다. –

1

deallocator가 호출되지 않도록 여분의 참조를받는 것이 더 깔끔하지 않을까요? (여전히 깨끗한 것은 아니지만).

Boost에는 작업을 수행 할 수있는 기능이 없다고 말할 수는 없지만 포함시키려는 것처럼 들리는 것은 아닙니다.

편집

:는 의견과 약간의 문서를 읽으면서,이 귀결 :

  1. 참조 누출. 어떤 시점에서 다음을 실행하십시오.

    new shared_ptr(my_global_shared_ptr); 
    

    장점 : 개념 상 쉽습니다. 단점 : 힙에서 뭔가를 누출하고 있습니다.

  2. 맞춤 해제 기. shared_ptr은 deallocator 함수가 거의 필요 없기 때문에 다른 대답에서 제공된 것과 같은 익명 ID 함수가 정상적으로 작동합니다.

    장점 : 부스트를 활용하고 절대적으로 오버 헤드가 없습니다. 단점 : 약간의 문서가 필요합니다.

  3. 비 정적 전역 개체입니다. 개체에 대한 글로벌 shared_ptr이있는 경우 해당 개체에 대한 유일한 액세스 수단이어야합니다. 전역 선언을 으로 초기화 된 shared_ptr으로 바꿉니다. 나는 이것이 최고라고 생각한다. ':: _ 1 람다 :: 향상'

    #include <boost/shared_ptr.hpp> 
    #include <boost/lambda/lambda.hpp> 
    
    int main() 
    { 
        int *p = new int(5); 
    
        { 
         boost::shared_ptr<int> sp(p, boost::lambda::_1); 
        } 
    
        delete p; 
    } 
    

    하나 개의 인자를 빈 펑를 만듭니다

+0

추가 참조 자료는 어떻게 작성합니까? 나는'shared_ptr' 수에 접근 할 수 있다고 생각하지 않았습니다. –

+0

@ 마크 랜섬 : 나는 그가'shared_ptr'을 복사하고 어딘가에 저장하는 것을 의미한다고 생각합니다. –

+0

그래,하지만 여분의 복사본은 결국 파괴 될거야. 실용적이지 않습니다. –

3

솔루션 Boost.Lambda를 사용합니다.

사람들이 왜 그랬는지 알 수 있도록 // 거기에 댓글을 달아보십시오.

+1

* "내 코드를 뿌리기 싫어"* 카테고리에 해당됩니다. –

+0

이 솔루션은 boost :: lambda :: _ 1 대신 가상의 boost :: no_op_deallocator()를 사용하는 것보다 더 뿌리 는가? – scjohnno

+2

아주 똑똑한 해결책이지만, 나는 어딘가에 사소한 기능을 갖고 그것을 설명하는 이름을 부여하고 싶다고 생각한다. –

0

FWIW, 여기 내가 사용하고있는 것. 로컬 테스트를 단위 테스트에서 사용하여 shared_ptr에 로컬을 적용합니다.

// The class NoOp_sptr_Deleter can be used to construct a shared_ptr<>() 
// that will NOT delete the pointee. 
// This can be helpful in unit-testing. Wrapping a local as a shared_ptr. 
// Do take care with the lifetimes though. 
struct NoOp_sptr_Deleter 
{ 
    void operator()(void const *) const {} 
}; 

template<typename T> 
boost::shared_ptr<T> FakeSharedPtrFromRef(T& aRef) 
{ 
    return boost::shared_ptr<T>(&aRef, NoOp_sptr_Deleter()); 
} 
+0

OP는 Boost 또는 stdlib에서 이미 제공 한 솔루션을 요청했습니다. 그는 그러한 함수/펑터를 작성하는 것이 매우 간단하다는 것을 알고 있습니다. – Xeo

관련 문제