请考虑以下代码。
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;
}
无输出。 没有desctructor 被调用。内存泄漏。 我一直认为智能指针有助于避免内存泄漏。
如果我需要在课程中进行交叉引用,我该怎么办?
答案 0 :(得分:49)
如果您有这样的循环引用,则一个对象应该与另一个对象保持weak_ptr
,而不是shared_ptr
。
来自the shared_ptr
introduction:
由于实现使用引用计数,因此不会回收
shared_ptr
个实例的循环。例如,如果main()
持有shared_ptr
到A
,shared_ptr
直接或间接地将A
保留回A
,shared_ptr
的使用计数将为2.原始A
的销毁将使weak_ptr
悬空,使用次数为1.使用{{1}}“打破周期。”
谢谢,Glen,链接。