classA { public: shared_ptr<B> a; ~A() { cout << "delete class A" << endl; } }; classB { public: shared_ptr<A> b; ~B() { cout << "delete class B" << endl; } }; intmain() { shared_ptr<A> a = make_shared<A>(); shared_ptr<B> b = make_shared<B>(); cout << "a use count:" << a.use_count() << endl; cout << "b use count:" << b.use_count() << endl; a->a = b; b->b = a; cout << "a use count:" << a.use_count() << endl; cout << "b use count:" << b.use_count() << endl; return0; }
运行结果:
1 2 3 4
a use count:1 b use count:1 a use count:2 b use count:2
在上面的例子中,当创建智能指针 a 和 b
时,两个智能指针的引用计数器加 1,因此前两行输出均为 1,当
a 的智能指针成员指向 b,b
的智能指针成员指向 a 后,两个智能指针的引用计数器又加
1,因此最后两行输出为 2,此时程序运行结束,a 和
b 均离开作用域,则引用计数起减
1,此时两个智能指针的引用计数器为
1,认为还有指针指向内存,无法调用两个类的析构函数,造成内存泄露。