c++ - unique_ptr 和内存分配失败
问题描述
我想使用unique_ptr<A>(new A)
(not make_unique()
) 创建一个唯一指针。
构造unique_ptr
函数是noexcept
,但是new
可能会抛出bad_alloc
。
unique_ptr<A>(new A)
所以我的问题是,如果new
失败,我是否应该期待异常调用?
我试图检查一下,我在下面的代码中得到了“中止”,而我希望"null"
在屏幕上看到。所以看起来,万一new
失败,unique_ptr
会抛出异常。
那是对的吗?
class A
{
public:
int vec[1000000000];
};
int main()
{
A* a[100000];
for (int i = 0; i < 100000; ++i)
{
a[i] = unique_ptr<A>(new A).release();
if (!a[i])
{
cout << "null" << endl;
break;
}
}
return 0;
}
注意:此代码的唯一目标是填充内存,从而导致new
失败。
解决方案
unique_ptr<A>(new A)
所以我的问题是,如果new
失败,我是否应该期待异常调用?
是的。如果new
失败,则会抛出std::bad_alloc
异常,std::unique_ptr
甚至根本不会构造对象。
我试图检查一下,我在下面的代码中得到了“中止”,而我希望
"null"
在屏幕上看到。所以看起来,万一new
失败,unique_ptr
会抛出异常。那是对的吗?
不new
,是抛出异常的人,而不是std::unique_ptr
构造函数(正如您所指出的,由于存在,它无论如何都不能noexcept
)。由于在构造函数之外new
被调用,因此被标记为的构造函数是无关紧要的。noexcept
如果要避免std::bad_alloc
抛出异常,请使用 的std::nothrow
版本new
,例如:
#include <new>
a[i] = unique_ptr<A>(new(nothrow) A).release();
或者,由于您的使用unique_ptr().release()
违背了 的全部目的std::unique_ptr
,因此完全省略它:
a[i] = new(nothrow) A;
不要忘记delete
成功new
编辑的任何内容。
推荐阅读
- apache-flink - Flink 中 Spark RDD.persist(..) 的任何等效功能?
- excel - excel cubset函数获取2列集
- java - Facebook Java SDK | 营销 API 错误 #803
- virtualenv - 默认形式的 Conda 基础环境
- git - 詹金斯奴隶无法克隆 git repo
- javascript - 抽屉关闭时触发 useEffect 的问题
- amazon-cloudwatch - AWS Cloudwatch Insights - 将字符串解析为 JSON
- facebook - Facebook 页面访问令牌查询 - 正文类型为“字符串”而不是“对象”
- reactjs - const 组件无法读取 undefined 的属性,即使它是一个道具?
- javascript - Axios 错误响应:处理 catch 子句中的错误时如何读取请求方法