shared_ptr-为什么会中断?

诺德

在开发类似树的数据结构时,我写了这样的内容:

    #include <memory>

    class Node: public std::enable_shared_from_this<Node> {
    public:

        void set_root(Node & n);
    private:
        std::shared_ptr<Node> root;
        std::shared_ptr<Node> leaf;
    };

    void Node::set_root(Node & n) {
        root = n.shared_from_this();
        n.leaf = shared_from_this();
    }

    int main() {
        Node n1, n2;
        n1.set_root(n2);
    }

代码使用clang编译,但会中断运行时间(“ libc ++ abi.dylib:以类型为std :: __ 1 :: bad_weak_ptr:bad_weak_ptr的未捕获异常终止)”为什么?

编辑因此,基于答案,我想出了一个似乎可行的版本:

    #include <memory>

    class Node;
    typedef std::shared_ptr<Node> Node_SP;

    class Node: public std::enable_shared_from_this<Node> {
    public:

        void set_root(Node & n);
    private:
        std::shared_ptr<Node> root;
        std::shared_ptr<Node> leaf;
    };

    void Node::set_root(Node & n) {
        root = n.shared_from_this();
        n.leaf = shared_from_this();
    }

    int main() {
        Node_SP n1 = std::shared_ptr<Node>(new Node);
        Node_SP n2 = std::shared_ptr<Node>(new Node);

        n1->set_root(*n2);
    }
用户541686

shared_ptr 假定对象是在堆上分配的,但是您已经在堆栈上分配了它。

new改用并shared_ptr致电delete给您。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么unique_ptr <void>格式错误,但shared_ptr <void>合法?

为什么shared_ptr删除程序必须是CopyConstructible的?

为什么不推荐使用std :: shared_ptr :: unique()?

std :: shared_ptr和std :: experimental :: atomic_shared_ptr有什么区别?

在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

为什么std :: shared_ptr <void>工作

shared_ptr的别名构造函数是什么?

std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

shared_ptr类的get()成员有什么用途?

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

为什么shared_ptr具有移动构造函数

为什么shared_ptr使用新的展示位置

为什么不再允许从数组的unique_ptr创建shared_ptr?

为什么const shared_ptr <const T>&和const shared_ptr <T>&显示不同的引用计数?

复制shared_ptr会发生什么?

为什么shared_ptr需要保持weak_ptr的引用计数?

C ++的shared_ptr的Rust等效于什么?

为什么要使运算符新的私有中断std :: shared_ptr?

为什么std :: enable_shared_from_this允许多个std :: shared_ptr实例?

为什么我可以在C ++中将常量shared_ptr分配给非常量shared_ptr?

在此示例中,什么是“别名本地shared_ptr”

为什么unique_ptr和shared_ptr不会使它们的构造指针无效?

为什么不将shared_ptr派生到隐式转换为shared_ptr到Base

我的shared_ptr声明中有什么错误?

RAII和shared_ptr之间是什么关系?

shared_ptr的控制块内部的虚函数是什么?

为什么存在shared_ptr的原子重载

使用 shared_ptr 在中断时结束多线程循环

为什么 shared_ptr 不删除它的内存?