gpt4 book ai didi

c++ - operator new 是否在异常后破坏初始化的对象?

转载 作者:行者123 更新时间:2023-11-30 02:06:56 25 4
gpt4 key购买 nike

我有一个类 A,它使用 new 在其构造函数中分配内存。当我分配一大块 A 并且(当 new[] 正在初始化单个 A 时)其中一个抛出 std::bad_alloc 在他们的构造函数中?

operator new[] 是否会破坏已经初始化的对象?还是我有责任确保构造函数不会抛出异常?

编辑:new 的两次调用可能听起来很困惑,所以这里有一段代码可以澄清:

class A
{
int* mem;
public:
A()
{
try
{
mem = new int[3];
}
catch(bad_alloc&)
{
throw 5;
}
}
~A()
{
delete[] mem;
}
}

A* list = 0;

try
{
list = new A[50000];
}
catch(int)
{
// When I get here, did the new[] above call the destructors
// of all the objects it managed to construct before one of them threw?
}

最佳答案

如果你执行 new Foo() 并且 Foo 的构造函数抛出异常,那么由相关的 operator new 分配的内存将被释放.如果 Foo 的任何成员的构造函数成功,该成员的析构函数将被调用。

如果您执行 new Foo[100],并且第 42 个构造函数抛出异常,那么所有已经构造的 Foo 对象都将被销毁(以相反的顺序)。

关于c++ - operator new 是否在异常后破坏初始化的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8370955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com