我发现不允许在类的析构函数中调用 shared_from_this :
https://svn.boost.org/trac/boost/ticket/147
我理解这个论点,但是如果我需要一个“shared_from_this”指针来清理引用(而不是共享所有权)怎么办。
这是我不使用 shared_ptr 的示例:
class A{
public:
A( Manager * m ) : m_(m) {
m_->add(this);
}
~A() {
m_->remove(this);
}
private:
Manager * m_;
};
在这里,我尝试将其转换为共享指针。但是我找不到完成析构函数的好方法:
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() {
m_->add(shared_from_this());
}
Manager * m_;
};
如何在上面的示例中实现析构函数?
最佳答案
如果您的 Manager 对您的对象有 shared_ptr
,则它拥有它。
因此您的对象不会被破坏,因为 Manager 仍然有对它的引用。
您可以将弱指针传递给管理器,但是管理器的工作是检查指针是否仍然有效,如果无效则将其删除。
你的问题很有趣,但你的情况是由一种误解引起的。只要一个对象拥有对您的对象的引用,shared_ptr 的目标就是它不会被破坏。对于要调用的析构函数,您应该在指针上手动调用 delete,这在使用 shared_ptr 时是一种不好的行为。
简单定义谁真正拥有对象,并给他们shared_ptr。如果一部分代码偶尔需要你的对象——如果它存在——那么给它一个weak_ptr。
关于c++ - boost shared_from_this 和析构函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8501503/