문제

또한보십시오: 비슷한 질문

아래 코드는 분명히 위험합니다. 문제는 : *이것에 대한 참조를 어떻게 추적합니까?

using namespace boost;

// MyClass Definition
class MyClass {

public:
   shared_ptr< OtherClass > createOtherClass() {
      return shared_ptr< OtherClass > OtherClass( this ); // baaad
   }
   MyClass();
   ~MyClass();
};

// OtherClass Definition
class OtherClass {

public:
   OtherClass( const *MyClass myClass );
   ~OtherClass();
};

// Call; pMyClass refcount = 1
shared_ptr< MyClass > pMyClass( new MyClass() );

// Call; pMyClass refcount = 1 => dangerous
pMyClass->createOtherClass();

답이 있습니다 (아래 게시), 나는 단지 stackoverflow에 있기를 원합니다 (내가 틀렸을 때 모두를 수정할 수있는 곳).

도움이 되었습니까?

해결책

열쇠는 확장하는 것입니다 enable_shared_from_this<T> 그리고 사용하십시오 shared_from_this() shared_ptr을 얻는 방법 *this

자세한 정보

using namespace boost;    

// MyClass Definition
class MyClass : public enable_shared_from_this< MyClass > {

public:
   shared_ptr< OtherClass> createOtherClass() {
      return shared_ptr< OtherClass > OtherClass( shared_from_this() );
   }
   MyClass();
   ~MyClass();
};

// OtherClass Definition
class OtherClass {

public:
   OtherClass( shared_ptr< const MyClass > myClass );
   ~OtherClass();
};

// Call; pMyClass refcount = 1
shared_ptr< MyClass > pMyClass( new MyClass() );

// Call; pMyClass refcount = 2
pMyClass->createOtherClass();

다른 팁

몇 가지 문제 :
코드가 컴파일되지 않습니다 !!

코드는 남용/잘못된 사용을 중지하는 방식으로 설계되지 않았습니다.

MyClass            x;
SharedPtr<MyClass> y = x.createOtherClass();

이제 뭐?
이것은 완벽하게 좋은 사용 케이스처럼 보입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top