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

使用unique_ptr<A>(new A)时内存分配失败是否会抛出异常?

问题解答

核心结论

你的结论不正确:unique_ptr本身不会抛出异常,你遇到的程序abort是默认new操作符分配失败抛出std::bad_alloc异常未被捕获导致的,异常抛出时还没有进入unique_ptr的构造逻辑。

原理说明

C++标准中默认的new操作符分配内存失败时,默认行为是抛出std::bad_alloc异常,不会返回空指针。只有使用不抛出异常的重载版本new(std::nothrow) 类型时,分配失败才会返回空指针,不会触发异常。

你提到的unique_ptr接收裸指针的构造函数是noexcept的描述完全正确,只要你传入的参数是合法的指针值(无论为空还是指向有效内存),unique_ptr的构造过程不会抛出任何异常。

你的代码问题分析

你代码中使用的是默认抛异常的new A,当内存耗尽分配失败时,new直接抛出异常,后续unique_ptr构造、release()调用、if (!a[i])判空逻辑完全不会执行,未被捕获的异常会直接触发程序abort,和unique_ptr没有任何关系。

修正后的验证代码

如果要验证分配失败返回空的场景,改成nothrow版本的new即可:

#include <iostream>
#include <memory>
#include <new>

using namespace std;

class A
{
public:
    int vec[1000000000];
};

int main()
{
    A* a[100000];
    for (int i = 0; i < 100000; ++i)
    {
        // 使用不抛出异常的new重载
        a[i] = unique_ptr<A>(new(nothrow) A).release();
        if (!a[i])
        {
            cout << "null" << endl;
            break;
        }
        // 实际开发中请记得释放内存避免泄漏,示例省略相关逻辑
    }
    return 0;
}

运行上述代码就会输出你预期的null结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 21:54:04