正常情况下:
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;
}