为什么C++中delete运算符会调用析构函数而free函数不会?
问题解答
核心区别在于**new/delete是C++内置关键字,malloc/free是C标准库函数**,二者的执行逻辑有本质差异,和你重载的operator new/operator delete内部实现无关:
new关键字的执行固定分为两步:- 调用
operator new函数(就是你重载的版本)分配指定大小的原始内存 - 在分配好的原始内存上调用对应类的构造函数,完成对象初始化
- 调用
- 与之对应,
delete关键字的执行也固定分为两步:- 先调用指针对应对象的析构函数,完成对象内部资源的清理
- 调用
operator delete函数(就是你重载的版本)释放原始内存
你重载的只是operator new/operator delete这两个负责「内存分配/释放」阶段的函数,完全不会改变new/delete关键字本身自带的「构造/析构」逻辑,所以哪怕你重载的operator delete内部调用了free,delete执行时依然会先执行析构,再调用你写的内存释放逻辑。
而free是完全不感知C对象模型的C库函数,它的功能只有一个:把传入指针指向的原始内存块还给操作系统。它不知道这块内存上有没有C对象,也没有任何调用析构函数的逻辑,所以直接用free释放new出来的对象时,就不会触发析构执行。
补充注意:如果你的类内部持有其他堆分配资源,直接用
free释放new出来的对象会直接造成资源泄漏,这也是C++标准明确禁止混用new/delete和malloc/free的核心原因之一。
内容的提问来源于stack exchange,提问作者Artaza Sameen
相关产品推荐
相关产品推荐

