文章目录
enable_shared_from_this的作用
在C++:智能指针(3)——无法通过原指针增加共享指针shared_ptr的计数,enable_shared_from_this解决中,我解释了智能指针share_ptr的缺陷: 无 法 通 过 原 指 针 增 加 共 享 指 针 的 统 一 引 用 计 数 \color{red}无法通过原指针增加共享指针的统一引用计数 无法通过原指针增加共享指针的统一引用计数
int * pt = new int();
shared_ptr<int> spt1(pt);
shared_ptr<int> spt2(pt);
std::cout << "spt1.use_count() = " << spt1.use_count() << std::endl;
std::cout << "spt2.use_count() = " << spt2.use_count() << std::endl;
导致重复释放
spt1.use_count() = 1
spt2.use_count() = 1
LeetCodePlayground(6326,0x1000dbdc0) malloc: *** error for object 0x102b5b8d0: pointer being freed was not allocated
LeetCodePlayground(6326,0x1000dbdc0) malloc: *** set a breakpoint in malloc_error_break to debug
(lldb)
这个问题在操作类实例时,使得我们无法从this
直接构造shared_ptr
;(enable_shared_from_this的本质是在为类对象与引用计数不存放在一起这件事擦屁股)
用法
class Good : public std::enable_shared_from_this<Good> // 必须公有继承
{
public:
std::shared_ptr<Good> getptr() {
return shared_from_this();
}
~Good() {
std::cout << "Good::~Good() called" << std::endl; }
};
shared_from_this();
来自std::enable_shared_from_this
稍后讲解
int main()
{
Good * _OrigPtr=new Good();
std::shared_ptr<Good> bp1(_OrigPtr);
std::shared_ptr<Good> bp2 = _OrigPtr->getptr();
// 打印bp1和bp2的引用计数
std::cout << "bp1.use_count() = " << bp1.use_count() << std::endl;
std::cout << "bp2.use_count() = " << bp2.use_count() << std::endl;
return 0;
}
- 首先在堆上定义
Good * _OrigPtr=new Good();
- 然后分配一个
shared_ptr<Good> bp1(_OrigPtr);
- 最后最重要的,我们用
_OrigPtr->getptr();
获取了另一个shared_ptr<Good> bp2
我们看一下输出
bp1.use_count() = 2
bp2.use_count() = 2
Good::~Good() called
Program ended with exit code: 0
bp1
与bp2
共同增加了引用计数; 解 决 了 无 法 通 过 原 指 针 增 加 共 享 指 针 的 引 用 计 数 \color{red}解决了无法通过原指针增加共享指针的引用计数 解决了无法通过原指针增加共享指针的引用计数;
问题1分析
一切正常
直到我不小心注释掉了一行代码:
- 然后分配一个
shared_ptr<Good> bp1(_OrigPtr);
int main()
{
Good * _OrigPtr=new Good();
// std::shared_ptr<Good> bp1(_OrigPtr);
std::shared_ptr<Good> bp2 = _OrigPtr->getptr(