/*
shared_ptr 与weak_ptr
*/
#include <memory>
#include <iostream>
void foo_construct()
{
int * p = new int(3);
std::shared_ptr<int> sptr(p);
std::shared_ptr<int> sptr2(new int(4));
std::shared_ptr<int> sptr3 = sptr2; //指针引用加1
std::shared_ptr<int> sptr4 = std::make_shared<int>(5);
/*
{
std::shared_ptr<int> sptr5(p);
{
std::shared_ptr<int> sptr6(p);
}
}//这么写会报错,原因生活会,因为5和6都是指向同一个对象,但是两者不相关联
//当6把对象p析构之后,对象5并不知道,导致对象5的指针对象呗析构了
*/
}
class Person;
class Son;
class Person
{
public:
Person(){}
~Person(){}
void Set(std::shared_ptr<Son> pson)
{
m_pson = pson;
}
private:
std::weak_ptr<Son> m_pson;
};
class Son
{
public:
Son();
~Son();
void Set(std::shared_ptr<Person> per)
{
m_per = per;
}
private:
std::weak_ptr<Person> m_per;
};
//智能指针避免循环引用:解决办法加弱指针
void testShared()
{
Son* pson = new Son();
Person * pPer = new Person();
{
std::shared_ptr<Person> shared_Perent(pPer);
std::shared_ptr<Son> shared_Son(pson);
shared_Perent->Set(shared_Son);
shared_Son->Set(shared_Perent);
std::cout << shared_Perent.use_count() << std::endl;
std::cout << shared_Perent.use_count() << std::endl; //
}//按道理被释放,可是到这里并没有被释放。没有析构
}
int main(){
//foo_construct();
testShared();
getchar();
return 0;
}