#include <iostream>
#include <memory>
using namespace std;
class B;
class A
{
public:// 为了省去一些步骤这里 数据成员也声明为public
// weak_ptr<B> pb;
shared_ptr<B> pb;
A()
{
cout << "A struction" << endl;
}
void doSomthing()
{
/*if (pb.lock())
{
}*/
}
~A()
{
cout << "kill A\n";
}
};
class B
{
public:
// weak_ptr<A> pa;
shared_ptr<A> pa;
B()
{
cout << "B struction" << endl;
}
~B()
{
cout << "kill B\n";
}
};
int main(int argc, char **argv)
{
shared_ptr<A> sa(new A());
shared_ptr<B> sb(new B());
if (sa && sb)
{
sa->pb = sb;
sb->pa = sa;
}
//对于指针来说,当new时会调用构造函数,当delete时会调用析构函数,若程序运行后时,没有调运析构函数,说明没有delete,可以以此验证变量所指内存是否销毁,比如要想sa指向的内存是否释放,必须在sa出作用域后,看sa的析构函数是否被调用.
//弱引用存在的意义是打破循环引用,弱引用不会增加计数,但是会指向存在的内存;
//当A要释放时,若B为强引用,则必须先释放B,若B为弱引用,A跳过B直接释放;
//同时为强引用,sa.use_count() == 2, sb.use_count() == 2;只会调用构造函数,不会调用析构函数
//同时为弱引用。能正常释放,sa.use_count() == 1, sb.use_count() == 1;
//B中a为弱引用,先释放A,在释放B,由于a为弱引用,a的计数会少一个
//A中B为弱引用,先释放B,在释放A,由于b存在一个弱引用,故b计数会少一个
cout << "sb use count:" << sb.use_count() << endl;
cout << "sa use count:" << sa.use_count() << endl;
return 0;
}
Q:use_count()指什么
A:指的是有多少个指针变量指向该指针指向的该块内存,例如sa.use_count()表示指向new A()的指针数量
Q:当使用弱指针时,会有一个内存的计数为2,他会正常释放吗?为什么
1.不使用使用释放前,
2.释放后,都会要求对方先释放