如何在delete一个void *对象后有效执行析构函数

正常情况下:
classT *pA = new classT();
delete pA;
很容易实现完成。

如下代码就会有些需要注意的地方:
classT *pA= new classT();
void *pHandle = pA;
delete pHandle;  //这里就不能有效的执行析构函数,可能会造成内存泄漏。
怎么办呢?
其实和很简单,如下就可以。
delete (classT *)pHandle;
问题来了,上面的实现是基于你已经知道它为class类,如果不能确定又该怎么办?其实也很简单大家都继承于一个基类就ok了,实现如下:
class CBaseClass
{
public:
 CBaseClass()
 {
  printf("CBaseClass gz\n");
 }
 virtual ~CBaseClass()
 {
  printf("CBaseClass xg\n");
 }
};
class classT : public  CBaseClass
{
public:
 classT()
 {
  printf("classT gz\n");
 }
 virtual ~classT()
 {
  printf("classT xg\n");
 }
};

delete (CBaseClass *)pHandle; //这样处理后,这样释放就ok了,因为基类我们设计时是清楚的。

其实还有一个问题,因为如果在一个成熟框架中,我们是不好随便增加基类的(PS:危险而且工作量巨大),但是目前又需要这种释放方式该怎么办?设计如下:

class CTest
{
public:
 CTest()
 {
  printf("CTest gz\n");
 }
 ~CTest()
 {
  printf("CTest xg\n");
 }
 void print()
 {
  printf("CTest\n");
 }
};

class CBaseClass
{
public:
 CBaseClass()
 {
  printf("CBaseClass gz\n");
 }
 virtual ~CBaseClass()
 {
  printf("CBaseClass xg\n");
 }
};

template<class DataClass>
class CData : private CBaseClass
{
public:
 CData()
 {
  m_pHandle = NULL;
  printf("CData gz\n");
 }
 virtual ~CData()
 {
  if (NULL != m_pHandle) {
   delete (DataClass*)m_pHandle;
  }
  printf("CData xg\n");
 }

 void *m_pHandle;
};

int main(int argc, char* argv[])
{

 CData<CTest> *pData = new CData<CTest>();
 pData->m_pHandle = new CTest();
 void *pHandle = pData;
 delete (CBaseClass *)pHandle;

 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值