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

为什么C语言需要检查malloc返回值,而C++的new不需要?

问题核心结论

你描述的场景确实存在:如果用裸指针持有new分配的内存,后续new抛出std::bad_alloc时,已分配的裸指针内存因为没有机会执行delete,确实会发生泄漏。你给出的手动捕获异常再释放前置资源的写法是可运行的,但不是C++的推荐实践。

C++的标准解决方案:RAII机制

C++设计了**RAII(资源获取即初始化)**范式来统一处理资源自动回收问题,完全不需要手动编写层层回滚的释放逻辑,代码更简洁也更不容易出问题。
对于你给出的示例,最常用的改写方式是用智能指针托管动态内存:

#include <memory>
#include <cstdlib>

int main(void) {
    // 用std::unique_ptr托管动态分配的int
    auto ptr1 = std::make_unique<int>();
    auto ptr2 = std::make_unique<int>();

    // 直接使用两个指针即可,不需要手动delete
    return EXIT_SUCCESS;
}

这种写法下,如果ptr2的内存分配抛出std::bad_alloc,已经构造完成的局部对象ptr1会自动触发析构函数,自动释放持有的内存,完全不会发生泄漏。
如果是动态分配数组场景,直接使用std::vector容器即可,它本身就是RAII实现,内存分配、释放全部自动处理,分配失败时已经申请的空间会自动回收。

特殊场景的处理方式

  • 如果你确实需要自定义分配失败的业务逻辑(比如打印错误日志、持久化临时数据),可以捕获std::bad_alloc,但资源释放工作仍然交给RAII对象完成,不需要手动写释放代码。
  • 如果你不想使用异常机制,也可以用nothrow版本的new,行为和malloc一致,分配失败返回空指针:
#include <new>

int* ptr = new(std::nothrow) int;
if (ptr == nullptr) {
    // 自定义分配失败处理逻辑
}

就算使用nothrow版本的new,也仍然建议用智能指针托管返回的裸指针,避免后续逻辑跳转时忘记释放内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:48:01