在执行下面的第 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) {
...
}