为什么调用 std::make_shared 后 std::shared_ptr 的弱引用计数不为零?

问题描述 投票:0回答:0

在执行下面的第 40 和 41 行之后,调试器告诉我

std::shared_ptr
a
b
的弱引用计数是 2.

Value
的构造函数没有存储对这些对象的任何强引用或弱引用:

struct Value : public std::enable_shared_from_this<Value> {
    double data;
    double grad;
    std::function<void()> _backward;
    std::vector<std::shared_ptr<Value>> _prev;
    std::string _op;
    Value(double data,
          const std::vector<std::shared_ptr<Value>>& _children = {},
          std::string _op = "")
        : data{data}, grad{0}, _backward{[]{}}, _prev{_children}, _op{_op} {}
    ...
};

我希望这些对象只有单个强引用(我们可以在 shared_ptr 控制块中看到预期的强引用计数为 1)。 事实上,在这个代码库的任何地方都没有明确的

std::weak_ptr
被使用?调试器本身是否存储了对这些对象的弱引用(即 Heisenbug 问题)?

尚未执行的第 42 行调用了一个重载的

+
操作,但我不明白这将如何影响当前(或未来)的弱引用计数:

std::shared_ptr<Value> operator+(const std::shared_ptr<Value>& A,
                                 const std::shared_ptr<Value>& B) {
   ...
}
c++ shared-ptr smart-pointers weak-ptr enable-shared-from-this
© www.soinside.com 2019 - 2024. All rights reserved.