c++11之enable_shared_from_this

博客介绍了enable_shared_from_this的主要作用,即安全获取指向继承该模板类的指针。通过示例指出直接用this指针传递给std::shared_ptr不能增加引用计数,会导致析构异常,而继承std::enable_shared_from_this并用shared_from_this()获取指针可避免该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

enable_shared_from_this的主要作用是用来安全地获取指向这个类(即继承enable_shared_from_this模板的类)的指针,有人会说,c++类不是都有默认的this用来指向这个类吗,何必还要再采用enable_shared_from_this的方法呢,大家先从一个例子来看用this指针会存在的问题:

#include<memory>
#include<iostream>

class CSharePtr{
public:
	CSharePtr();
	~CSharePtr();
	std::shared_ptr<CSharePtr> get_Ptr()
	{
		std::shared_ptr<CSharePtr> ptr(this);
		return ptr;
	}

};
typedef std::shared_ptr<CSharePtr> sharePtr;

//.cpp
#include "SharePtr.h"

CSharePtr::CSharePtr()
{
	std::cout << "create" << std::endl;
}


CSharePtr::~CSharePtr()
{
	std::cout << "destroy" << std::endl;
}

//main
void main()
{
	CSharePtr* pShPtr = new CSharePtr;
	sharePtr pr(pShPtr);
	sharePtr pr1 = pr->get_Ptr();
	int iUseCount = pr.use_count();
}

运行结果:构造函数调用了一次,而析构函数调用了两次,而IUseCount为1

问题就严重了,尤其是大型项目中,这种问题比较难排查的,为什么会是这种结果呢,因为给std::shared_ptr<CSharePtr>传递的this不能增加引用计数。那么怎么避免这种情况呢,将这个类继承std::enable_shared_from_this<CSharePtr>,并用shared_from_this()来获取指向类本身的指针,如下所示

#include<memory>
#include<iostream>

class CSharePtr:public std::enable_shared_from_this<CSharePtr>
{
public:
	CSharePtr();
	~CSharePtr();
	std::shared_ptr<CSharePtr> get_Ptr()
	{
		return shared_from_this();
	}

};
typedef std::shared_ptr<CSharePtr> sharePtr;

//,cpp
#include "SharePtr.h"

CSharePtr::CSharePtr()
{
	std::cout << "create" << std::endl;
}


CSharePtr::~CSharePtr()
{
	std::cout << "destroy" << std::endl;
}

void main()
{
	CSharePtr* pShPtr = new CSharePtr;
	sharePtr pr(pShPtr);
	sharePtr pr1 = pr->get_Ptr();
	int iUseCount = pr.use_count();
}

运行结果:一次构造,一次析构,iUseCount为1,正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值