1. 测试代码
#include <iostream>
#include <memory>
using namespace std;
class B;
class A {
public:
shared_ptr<B> pb;
~A() { cout << "kill A\n";}
};
class B {
public:
shared_ptr<A> pa;
~B() { cout << "kill B\n";}
};
int main()
{
shared_ptr<A> sa(new A());
shared_ptr<B> sb(new B());
if (sa && sb)
{
sa->pb = sb;
sb->pa = sa;
}
cout << "sa use count:" << sa.use_count() << endl;
return 0;
}
输出结果:
![]()
2. 测试代码
#include <iostream>
#include <memory>
using namespace std;
class B;
class A {
public:
weak_ptr<B> pb;
void doSomthing()
{
shared_ptr<B> pp = pb.lock();
if (pp)
{
cout << "sb use count:" << pp.use_count() << endl;
}
}
~A() { cout << "kill A\n";}
};
class B {
public:
shared_ptr<A> pa;
~B(){ cout << "kill B\n"; }
};
int main()
{
shared_ptr<A> sa(new A());
shared_ptr<B> sb(new B());
if (sa && sb)
{
sa->pb = sb;
sb->pa = sa;
}
sa->doSomthing();
cout << "sb use count:" << sb.use_count() << endl;
return 0;
}
输出结果:

智能指针与循环引用
本文通过两个测试代码示例,探讨了C++中智能指针shared_ptr和weak_ptr的使用,以及它们如何解决对象之间的循环引用问题。第一个示例展示了直接使用shared_ptr导致的循环引用,第二个示例则引入了weak_ptr来避免这一问题。
7万+

被折叠的 条评论
为什么被折叠?



