文章目录
用原指针定义两个shared_ptr造成重复释放内存
注意到shared_ptr的重复计数引用不能由原本指向的对象构造,即我们考虑这个空类
class Bad
{
public:
};
std::cout<<"shared_ptr不可通过原指针增加引用:"<<std::endl;
Bad * point2Bad=new Bad();
std::shared_ptr<Bad> bpa(point2Bad);
std::shared_ptr<Bad> bpb(point2Bad);
// 打印bpa和bpb的引用计数
std::cout << "bp1.use_count() = " << bpa.use_count() << std::endl;
std::cout << "bp2.use_count() = " << bpb.use_count() << std::endl;
输出
shared_ptr不可通过原指针增加引用:
bp1.use_count() = 1
bp2.use_count() = 1
这说明了原地址指针point2Bad
构造的share_ptr无法共享(增加引用计数),而是分别被判断为不同的引用;
这也就导致了作用域结束时,对share_ptr指针的释放,将造成指向堆内存的重复释放
问题的严重性
无法利用原地址增加 已存在的shared_ptr 的计数,这也就反映了shared_ptr并没有与原地址绑定,无法从原地址 找到 已经指向原地址的共享指针
当我们想获得一个类的某个实例的shared_ptr指针时,问题显现了
class Bad
{
public:
std::shared_ptr<Bad> getptr() {
return std::shared_ptr<Bad>(this);
}
~Bad() {
std::cout << "Bad::~Bad() called" << std::endl; }
};
return std::shared_ptr<Bad>(this);
也就是前文讨论的利用了原指针构造shared_ptr,从上面的结果我们知道,Bad::getptr()
会返回实例的一个新shared_ptr
,这说明了在实例的作用域结束后,将有可能被重复释放
enable_shared_from_this
class Good : public