如何避免shared_ptr内存泄漏?
-
11-09-2019 - |
题
考虑以下代码。
using boost::shared_ptr;
struct B;
struct A{
~A() { std::cout << "~A" << std::endl; }
shared_ptr<B> b;
};
struct B {
~B() { std::cout << "~B" << std::endl; }
shared_ptr<A> a;
};
int main() {
shared_ptr<A> a (new A);
shared_ptr<B> b (new B);
a->b = b;
b->a = a;
return 0;
}
有 无输出. 无析构函数 叫做。内存泄漏。我一直相信智能指针有助于避免内存泄漏。
如果我需要在类中进行交叉引用该怎么办?
解决方案
如果你有这样的循环引用,一个对象应该持有一个 weak_ptr
到另一个,而不是一个 shared_ptr
.
因为该实现使用了引用计数,所以循环
shared_ptr
实例将不会被回收。例如,如果main()
持有一个shared_ptr
到A
, ,直接或间接持有shared_ptr
回到A
,A
的使用次数将为 2。破坏原作shared_ptr
会离开A
悬空,使用次数为 1。使用weak_ptr
来“打破循环”。
谢谢格伦提供的链接。
不隶属于 StackOverflow