문제
또한보십시오: 비슷한 질문
아래 코드는 분명히 위험합니다. 문제는 : *이것에 대한 참조를 어떻게 추적합니까?
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();
이제 뭐?
이것은 완벽하게 좋은 사용 케이스처럼 보입니다!
제휴하지 않습니다 StackOverflow