我发现不允许在类的析构函数中调用shared_from_this:
https://svn.boost.org/trac/boost/ticket/147
此行为是设计使然。由于析构函数会销毁该对象,因此为它创建一个shared_ptr是不安全的,因为一旦析构函数结束,它就会变得悬空。
我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办?
这是一个我没有使用shared_ptr的例子:
class A{
public:
A( Manager * m ) : m_(m) {
m_->add(this);
}
~A() {
m_->remove(this);
}
private:
Manager * m_;
};
Run Code Online (Sandbox Code Playgroud)
这里我尝试将其翻译为共享指针。但我找不到完成析构函数的好方法:
class A : public boost::enable_shared_from_this< A > {
public:
typedef boost::shared_ptr< A > Ptr;
static Ptr create( Manager * m ) {
Ptr p( new A(m));
p->init();
return p;
}
~A() {
// NON-WORKING
// m_->remove( shared_from_this() );
}
private:
A( Manager * m ) : m_(m) { }
void init() { …Run Code Online (Sandbox Code Playgroud) 以某种方式p->start()被称为 - shared_from_this抛出bad_weak_ptr.
但正如你所看到的那样,p->start()被称为shared_ptr完全启动之后.
struct A : std::enable_shared_from_this<A>
{
std::thread* t = nullptr;
A() {}
~A(){
t->join();
delete t;
}
void f() {
try{
auto p = this->shared_from_this();
std::cout << "p:" << p.get() << "\n";
} catch(...) {
std::cout << "Exception !!!\n";
}
}
void start() {
t = new std::thread(&A::f,this);
}
};
std::shared_ptr<A> create() {
A* a = new A();
std::shared_ptr<A> p(a);
p->start();
return p;
}
int main()
{
int …Run Code Online (Sandbox Code Playgroud)