Cpp 对象模型探索 / delete 运算符内部调用过程分析
一、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);#elsefree(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!)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
