You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中new创建的动态对象能否用free释放?析构删除的类动态对象如何释放

问题1:将pf转换为void*后通过free释放动态对象是否安全?

该操作完全不安全,属于C++标准定义的未定义行为,没有任何可靠性可言,核心原因如下:

  • C++标准明确约束:new表达式分配的动态对象必须通过匹配的delete表达式释放,混用new和free本身就是违规操作,无论中间做什么指针类型转换都不会改变其未定义的本质。
  • 即便当前编译环境中new底层默认调用malloc分配内存,free也只能处理malloc分配的堆内存:如果Foo类自定义了类级别的operator new,分配的内存可能完全不属于malloc的管理范围,free操作会直接触发内存损坏、程序崩溃等问题。
  • 该写法完全不可移植,编译环境、标准库版本、编译选项的任何变动都可能导致运行结果异常。

问题2:析构函数被删除的类是否无法释放自由存储上的对象?

有合法的释放方案,完全可以安全释放,我们只需要匹配new的执行逻辑即可:
new Foo()实际分为两步执行:

  1. 调用对应作用域的operator new分配内存
  2. 调用Foo的默认构造函数构造对象
    我们无法直接用delete pf的原因是delete表达式会先尝试调用对象的析构函数,而~Foo()被删除,编译阶段就会报错。此时我们不需要(也不能)执行析构调用,只需要调用对应的operator delete释放第一步分配的内存即可:
// 对应使用全局operator new分配的场景
::operator delete(pf);

// 如果Foo自定义了类级别的operator new/delete,调用类自身的实现
Foo::operator delete(pf);

该写法完全符合C++标准要求,不存在未定义行为。


内容的提问来源于stack exchange,提问作者Itachi Uchiwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:30:01