提升shared_from_this和析构函数

2024-02-13

我发现不允许在类的析构函数中调用shared_from_this:

https://svn.boost.org/trac/boost/ticket/147 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_;
};

这里我尝试将其翻译为共享指针。但我找不到完成析构函数的好方法:

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_;
};

如何实现上面示例中的析构函数?


如果您的经理有shared_ptr到你的对象,然后它拥有它。 因此,您的对象不应被破坏,因为管理器仍然拥有对它的引用。

您可以将弱指针传递给管理器,但管理器的工作是检查该指针是否仍然有效,如果无效则将其删除。

你的问题很有趣,但你的情况是由误解引起的。只要一个对象拥有对您的对象的引用,shared_ptr 的目标就是它不会被破坏。对于要调用的析构函数,您应该手动调用指针上的delete,这在使用shared_ptr 时是一个不好的行为。

简单定义谁真正拥有该对象,并给他们shared_ptr。如果代码的一部分偶尔需要您的对象(如果存在),则给它一个weak_ptr。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提升shared_from_this和析构函数 的相关文章

随机推荐