智能指针自动识别类型,正确调用析构函数的方法

本文介绍了如何使用智能指针在T为void或其他类型时,正确调用析构函数的方法。通过创建一个名为Destructor的类,继承自VoidClass,利用成员函数指针实现动态类型的析构。在智能指针中,通过union转换类型,确保析构函数的正确调用。构造函数自动识别类型,将B类的析构函数转化为m_DestructFunc保存,实现了统一处理各种类型指针的析构。
摘要由CSDN通过智能技术生成

智能指针大家都知道,里面保存了一个形如 T* m_Pointer的指针,当引用计数为零时自动删除m_Pointer,

当T不为void时大家都会写,但是当T为void时,编译器在编译到delete m_Pointer时必定会报错。怎么办呢?我也是苦思冥想好久才用奇技淫巧解决之。而且不光解决void的删除问题,所有类型都可以用这种方法统一解决。解决的关键在成员函数指针。


delete是运算符没办法转化成成员函数,所以声明一个类用来封装之,为了之后统一处理的方便这个类会继承自一个叫VoidClass的类,代码如下:

class VoidClass
{
public:
	VoidClass()
	{
		m_Pointer=0;
	}
	VoidClass(void* p)
	{
		m_Pointer=p;
	}
	void* GetPointer(){return m_Pointer;}
	bool  IsNull(){return m_Pointer==0?1:0;}
private:
	void* m_Pointer;
};

template<typename T>
class Destructor:public VoidClass
{
public:
	Destructor(T* p):VoidClass(p)
	{
	}
	void Do()
	{
		delete ((T*)GetPointer());
	}
};

方便保存成员函数指针,用两个typedef将成员函数类型定义出来:

typedef void(Destructor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值