- weak_ptr 智能指针是为了解决shared_ptr相互引用导致的死锁问题,它不控制对象的生命周期,不会增加对象的引用次数,和shared_ptr可以相互转化,是一种弱应用。
下面的代码就陷入了死锁,p1和p2相互引用导致计数一直为1,而对象得不到销毁。
#include<iostream>
#include<memory>
using namespace std;
class Dog{
public:
Dog(){
cout<<"Nameless dog created."<<endl;
s1="nameless";
}
Dog(string name){
cout<<"Dog is created:" << name<<endl;
s1=name;
}
void makefriend(shared_ptr<Dog> f)
{
ptr_friend=f;
}
void foo(){
cout<<"Dog "<<s1<<" rules. "<<endl;
}
~Dog(){
cout<<"Dog is destoryed:"<<s1<<endl;
}
private:
shared_ptr<Dog> ptr_friend;
string s1;
};
void test()
{
shared_ptr<Dog> p1=make_shared<Dog>("dog1");
shared_ptr<Dog> p2=make_shared<Dog>("dog2");
p1->makefriend(p2);
p2->makefriend(p1);
}
int main()
{
test();
return 0;
}
借助weak_ptr指针代码
#include<iostream>
#include<memory>
using namespace std;
class Dog{
public:
Dog(){
cout<<"Nameless dog created."<<endl;
s1="nameless";
}
Dog(string name){
cout<<"Dog is created:" << name<<endl;
s1=name;
}
void makefriend(shared_ptr<Dog> f)
{
ptr_friend=f;
}
void foo(){
cout<<"Dog "<<s1<<" rules. "<<endl;
}
~Dog(){
cout<<"Dog is destoryed:"<<s1<<endl;
}
private:
weak_ptr<Dog> ptr_friend;//此处设置为weak_ptr
string s1;
};
void test()
{
shared_ptr<Dog> p1=make_shared<Dog>("dog1");
shared_ptr<Dog> p2=make_shared<Dog>("dog2");
p1->makefriend(p2);
p2->makefriend(p1);
}
int main()
{
test();
return 0;
}
对象成功销毁。