c++ - boost shared_from_this 和析构函数

标签 c++ boost shared-ptr object-lifetime weak-ptr

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

https://svn.boost.org/trac/boost/ticket/147

This behavior is by design. Since the destructor will destroy the object, it is not safe to create a shared_ptr to it as it will become dangling once the destructor ends.

我理解这个论点,但是如果我需要一个“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。

关于c++ - boost shared_from_this 和析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501503/

相关文章:

c++ - 简单的 WinAPI 应用程序有一个额外的控制台窗口

c++ - Boost BGL Dijkstra 最短路径

c++ - 比较不同大小的数组

c++ - 在windows上使用zlib编译boost 1.62/1.63

c++ - 使用带有 std::array 作为参数的 std::make_shared 初始化 std::shared_ptr

c++ - 在范围内保持 shared_ptr

c++ - std::string += 运算符

c++ - 通用 Makefile 忽略变量

c++ - 多重继承中的虚表实现

c++ - shared_from_this() 返回 std::shared_ptr<const X>,而不是 std::shared_ptr<X>