2012-02-21 2 views
2

스마트 포인터에 건설적인 입력을하고 싶습니다.강한 스마트 포인터/약한 스마트 포인터에 대한 의견

C++ 11 표준은 종속성주기를 발생시키지 않는 "약한"가장자리를 가진 DAG로 데이터 종속성을 모델링 할 수 있도록 unique_ptrweak_ptr을 정의합니다. 따라서 weak 포인터와 weak 포인터의 구분은 유형 수준에서 모델링됩니다.

런타임시 상태 플래그를 통해 소유권을 결정하는 스마트 포인터는 어떻습니까?

라이브러리에는 힙이나 스택의 개체를 가리킬 수있는 스마트 포인터가 있습니다.

MyClass myObj; 
my_ptr<MyClass> ptr(&myObj, Slave()); 
my_ptr<MyClass> ptr2(new MyClass(), Master()); 

다른 장점과 단점이 있습니까? 지금까지는 어떤 라이브러리에서나 똑똑한 포인터를 찾을 수 없었습니다. 처음으로이 기능이 필요한지 또는 벙어리/위험한 생각입니까?

모든 의견을 보내 주셔서 감사합니다.

편집 분명히

, 나는 충분히 자신을 분명하게하지 않았습니다. 하나의 마스터와 임의의 수의 슬레이브 만있을 수 있습니다. 이렇게하면 내가 제안한 체계는 훨씬 간단하기 때문에 weak/strong 포인터와 다릅니다.

struct DontDelete { template<class T> void operator()(T*) {} }; 

MyClass myObj; 
std::shared_ptr<MyClass> ptr(&myObj, DontDelete()); 
이 기능은 또한 다른 많은 경우에 유용

, 예를 들면 :

template <typename T> 
class my_ptr 
{ 
    enum PtrState { MASTER, SLAVE } }; 

    T * ptr; 
    PtrState state; 

    my_ptr() : ptr(), state(MASTER) {} 
    // ... 
    ~my_ptr() { if (state == MASTER) delete ptr; } 
    // ... 
}; 
+0

약한 포인터는 객체에 접근하려면'lock() '을 호출해야하지만, 강한 포인터는 호출하지 않아도됩니다. 그 차이점을 어떻게 해결합니까? 'lock()'을 항상 사용하고 마스터의 경우 아무 일도하지 않습니까? – rodrigo

+0

@rodrigo : 아마도 이것을 간과 했겠지만, 어디에서'lock()'이 필요한지, 가능한 편집을 위해 편집을 참조하십시오. – Manuel

+0

그러나 그렇다면 '슬레이브'포인터의 핵심은 무엇입니까? 그것은 새로운 포인터가없는'my_ptr'에 랩 된 일반 포인터 일뿐입니다. 주인이 파괴되면 모든 노예가 매달려 있습니다 ... 그리고 그것이 바로 약점들이 피하기로되어있는 것입니다. – rodrigo

답변

3

shared_ptr는 사용자 정의 Deleter가를 작성할 수 있습니다 :

my_ptr 클래스는 포인터와 상태를 저장 shared_ptr<FILE>fclose 사용하여 파일을 닫을 수 있습니다 : 그것은 your_ptr보다 더 유연

FILE *f = fopen(...); 
// throw if f couldn't open 
std::shared_ptr<FILE> file(f, fclose); 
// deletes f automatically 

. 당신의 계획의

+0

마누엘이 말한 것과 완전히 직각의 행동이 아니겠습니까? 나는. 커스텀 Deleter를 추가 할 수있는 가능성은 마스터 포인터와 슬레이브 포인터를 명확하게 구분할 수있는 능력과는 아무런 관련이 없습니다. 아니면 내가 여기서 누락 된 것이 있습니까? – LiKao

+0

@LiKao : 내 이해는 OP가 weak_ptr이 무엇인지 오해한다는 것입니다. 나는 그의'Slave()'포인터가 약한 포인터가 아닌 평범한 포인터로 동작한다는 것을 확신합니다. 그렇지 않으면 문제의 코드가 어떻게 작동하는지 알 수 없습니다. – ybungalobill

+0

@ybungalobill : 예, 명백하게 나는 이것을 지적 해 주신 'weak_ptr'을 오해했습니다. – Manuel

1

한 가지 단점은 현재 작업중인 포인터가 마스터 하나입니다 확신 할 수 있습니다하지 않는 한my_ptr 작업이, 던질 수 것입니다.

난 당신이 명시 적으로 수명을 제어 할 필요가 상태 사방 에 마스터 당신의 작업 포인터를 촉진 수도 있겠죠,하지만 여기 당신에게 어떤 도움을주는 타입 시스템없이, 그냥이 명시 적으로 홍보 할 필요가 기능을 많이 기대 케이스. 특히 멀티 스레드 코드에서 비 마스터 포인터의 역 참조가 잠재적으로 실패 할 수 있습니다. 당신이이 마스터 또는 슬레이브 여부에 대한 포인터를 만들 때

은 아마도 당신은 정적으로 알고, 당신은 종종 당신이 그것을 사용하는 경우이 알아야 할 것처럼 보인다. 그래서, 당신은이 유형 정보를 버리고 그것을 재구성하고 있습니다 ... 왜?

관련 문제