今天我说一下我的理解。
我有一个需求,在类内部保留一个引用,即把自己的智能指针传递给其他的类:
1)在类的内部是不能二次使用shared_ptr来引用自己的,这样会循环引用无法释放;
2)这样就是内部需要一个weak_ptr来引用自己,但是这个值如何初始化是个问题:
因为不能使用类似下面的语句直接初始化,
weak_ptr<A> weak = this;
但是,如果类从std::enable_shared_from_this继承了,就可以了:
weak_ptr<A> conn = this->shared_from_this();
之后,再次引用时候可以通过weak_ptr锁定,可以二次获得shared_ptr;
代码如下:
// testShare.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <memory>
using namespace std;
class A : public enable_shared_from_this<A>
{
public:
A()
{
}
void set()
{
conn = this->shared_from_this();
}
int a;
weak_ptr<A> conn;
};
int main()
{
std::shared_ptr<A> ptr = std::make_shared<A>();
cout << ptr.use_count() << endl; // 1
std::shared_ptr<A> ptr1 = ptr->conn.lock();
if (!ptr1)
{
std::cout << "null\n"; // null
}
ptr->set();
cout << ptr.use_count() << endl; // 1
ptr1 = ptr->conn.lock();
cout << ptr.use_count() << endl; // 2
}
3)但是如果该类实例被删除了,weak_ptr也没有;其实此类将自己的智能指针传递给其他类时,实例本身自己还是活着的,所以函数直接this->shared_from_this()就可以;
比如:
fun(std::shared_ptr<A>& ptr)
{
dosomething();
}
// 在A的内部可以如下调用此函数
std::shared_ptr<A>& ptr = this->shared_from_this();
fun(ptr);