使用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
相关产品推荐
相关产品推荐

