【发布时间】:2018-07-03 10:42:26
【问题描述】:
看看std::weak_ptr 我在几个地方看到它可以用来解决由于使用std::shared_ptr 的循环依赖而导致的内存泄漏。例如,请参阅以下两个已接受的答案:[1]、[2]。
采用最后引用的答案,建议的解决方法是:
#include <memory>
#include <iostream>
struct B;
struct A {
std::shared_ptr<B> b;
~A() { std::cout << "~A()\n"; }
};
struct B {
std::weak_ptr<A> a;
~B() { std::cout << "~B()\n"; }
};
void useAnB() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b = b;
b->a = a;
}
int main() {
useAnB();
std::cout << "Finished using A and B\n";
}
不过,这感觉有点过头了,为什么不简单地使用引用呢?我知道在这个例子中 b->a 没有在构造函数中设置,所以引用不会真正削减它,所以我的问题是:
是否有理由使用
std::weak_ptr而不是引用 if 如果我们可以在 构造函数?
注意:我理解std::weak_ptr 用于保存可以失效的引用。我的问题只涉及当重点是打破循环依赖时的有用性。
【问题讨论】:
-
确实有不止一种方法可以打破循环依赖。使用共享和弱指针更多的是所有权问题。在这种情况下,谁拥有 A 和 B。
-
为了使问题更加集中,您可以比较引用和常量非拥有智能 ptr(不是智能 ptr 到 const)。
标签: c++ reference smart-pointers weak-ptr