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

智能指针大家都知道,里面保存了一个形如 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值