一、delete 调用过程
1、测试代码,在 delete 处打下断点。
class CTest
{
public:
CTest() {}
~CTest() {}
};
int main()
{
CTest* pt1 = new CTest();
delete pt1;
return 0;
}
2、查看反汇编,代码如下:
之后再查看 operator delete 函数的 C++源码,如下所示:
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
}
由代码可知,delete 操作本质上是调用了 free 函数,只不过针对是否是 Debug 模式而调用了不同版本的 free 函数。
流程图如下:
二、总结
1、delete 运算符的执行过程简述如下:
(1)获取需要释放的内存的地址。
(2)执行对象的析构函数(倘若有)。
(3)执行 operator delete 函数,里面执行 free 函数。
2、delete 和 operator delete 的关系。
(1)delete 是运算符,里面的执行的代码包括类的析构函数(若存在)和 operator delete 。
(2)operator delete 是函数,C++提供一个默认版本,里面包含了 free 函数。做为程序员,所能控制的是 operator delete 函数,可以对其进行重载,实现自己的内存释放函数。
(SAW:Game Over!)