c++什么时候不在析构函数里delelete而自己写个Destroy函数实现

来源:百度知道 编辑:UC知道 时间:2024/09/19 15:52:41
如题,我记得在某个地方看到说:
某种情况下
用于多态的基类 不用vitual析构函数 而自己写个Destroy函数来删除一些东西
大概是这样。具体说的什么忘了。
c++里有没这相关准则?忘记出处了……

哪些情况需要自己 写个destroy而不用析构函数?

这不是C++的规则,是习惯使然。

多态基类,一般都是使用虚析构函数的,这是为了防止内存泄露。你说的定义一个destroy函数来完成某些缓冲区的删除,也是一个方便的方法。毕竟通过虚析构函数来释放某些空间的话,逻辑上有时候会让人感觉有点不太好理解。所以定义一个destroy函数(虚函数),来手动明确的执行空间释放操作,(当然,把这个destroy函数放在基类的析构函数(非虚)里面被调用也可以——这样在继承类析构里面可以不用调用了)。

比如可以这样:
class CBase
{
public:
CBase(){};
~CBase(){ Destroy();}; // 基类析构中调用即可(不在析构中调用,显示调用也可以)。

virtual void Destroy()
{ delete [] pBufferBase;};

char* pBufferBase; // 假设构造时候分配了堆空间
}

class CChild: public CBase
{
public:
CChild(){};
~Child(){};// 这儿可以不调用了,省事

virtual void Destroy()
{
delete [] pBufferChild;
CBase::Destroy(); // 再调用父类的Destroy函数,执行父类成员的缓冲区释放。
}

char* pBufferChild; // 假设构造时候分配了堆空间
}

使用的时候:
CBase * pObject = new CChild;
delete pObject; // 这样使用 ,可以通过F11跟踪观察,就会发现执行过程,先基类析构函数-》子类Destroy函数-》基类Destroy函数。

这样,代码简洁,逻辑清晰。