shared_ptr 包含了一个指向对象的指针和一个指向控制块的指针。每一个由 shared_ptr 管理的对象都有一个控制块,它除了包含强引用计数、弱引用计数之外,还包含了自定义删除器的副本和分配器的副本以及其他附加数据。
当我们需要一个类对象返回本身并且该类使用了 shared_ptr 智能指针时,需要使用该模板类。当我们使用智能指针管理资源时,必须统一使用智能指针,而不能再某些地方使用智能指针,某些地方使用原始指针,否则不能保持智能指针的语义,从而产生各种错误。
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
// 析构函数
~Test()
{
cout << "Test Destructor." << endl;
}
// 获取指向当前对象的指针
shared_ptr<Test> GetObject()
{
return shared_ptr<Test>(this);
}
};
void test01()
{
{
shared_ptr<Test> p(new Test());
shared_ptr<Test> q = p->GetObject();
cout << p.use_count() << endl; // 1
cout << q.use_count() << endl; // 1
} // 异常
}
void test02()
{
// 以上类似于
{
int *p = new int(10);
shared_ptr<int> p1(p);
shared_ptr<int> p2(p);
} // 异常
}
// 使用enable_shared_from_this模板类解决问题
#include <iostream>
#include <memory>
using namespace std;
class Test : public enable_shared_from_this<Test>
{
public:
// 析构函数
~Test()
{
cout << "Test Destructor." << endl;
}
// 获取指向当前对象的指针
shared_ptr<Test> GetObject()
{
return shared_from_this();
}
};
void test01()
{
{
shared_ptr<Test> p(new Test());
shared_ptr<Test> q = p->GetObject();
cout << p.use_count() << endl; // 2
cout << q.use_count() << endl; // 2
}
}
更深层次原理:enable_shared_from_this类模板中有一个弱指针 weak_ptr,这个弱指针能够监视 this 指针。在调用 shared_from_this 函数时,这个函数内部实际上是调用 weak_ptr 的 lock 方法。lock() 会让 shared_ptr 指针引用计数 + 1,同时返回这个 shared_ptr。
参考:https://blog.csdn.net/qq_38410730/article/details/105788724
参考:https://blog.csdn.net/weixin_44517656/article/details/114195265