스마트 포인터에 건설적인 입력을하고 싶습니다.강한 스마트 포인터/약한 스마트 포인터에 대한 의견
C++ 11 표준은 종속성주기를 발생시키지 않는 "약한"가장자리를 가진 DAG로 데이터 종속성을 모델링 할 수 있도록 unique_ptr
및 weak_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; }
// ...
};
약한 포인터는 객체에 접근하려면'lock() '을 호출해야하지만, 강한 포인터는 호출하지 않아도됩니다. 그 차이점을 어떻게 해결합니까? 'lock()'을 항상 사용하고 마스터의 경우 아무 일도하지 않습니까? – rodrigo
@rodrigo : 아마도 이것을 간과 했겠지만, 어디에서'lock()'이 필요한지, 가능한 편집을 위해 편집을 참조하십시오. – Manuel
그러나 그렇다면 '슬레이브'포인터의 핵심은 무엇입니까? 그것은 새로운 포인터가없는'my_ptr'에 랩 된 일반 포인터 일뿐입니다. 주인이 파괴되면 모든 노예가 매달려 있습니다 ... 그리고 그것이 바로 약점들이 피하기로되어있는 것입니다. – rodrigo