gpt4 book ai didi

c++ - 如果分配的内存在构造函数抛出异常后被释放

转载 作者:行者123 更新时间:2023-11-28 07:03:13 25 4
gpt4 key购买 nike

我知道 Object *pObject=new Object 包含两个步骤:

  1. operator new 分配内存
  2. 调用对象的构造函数。

并调用删除pObject:

  1. 调用对象的析构;
  2. 运算符删除以释放内存。

但是在new Object process的时候,如果第2步抛出异常,系统会调用operator delete释放内存吗?

最佳答案

不,没有调用析构函数。由于对象的构造不正确,因此调用析构函数是不安全的。但是,如果任何成员对象已完全构建,则它们将被破坏(因为对象是完整的)。

有些人建议不要加入构造函数,我相信它比僵尸状态更好,僵尸状态类似于错误代码并且会产生冗长的代码。只要您遵循 RAII,就应该没问题(每个资源都由它自己的对象管理)。在你投入构造函数之前,确保你清理了你已经完成一半的任何东西,但同样,如果你使用的是 RAII 那应该什么都没有。

以下输出“B”:

#include <iostream>

struct B {
~B() { std::cout << "B" << std::endl; }
};

struct A {
A() : b() { throw(1); }
~A() { std::cout << "A" << std::endl; }
B b;
};

int main() {
try {
A *a = new A;
delete a;
} catch(int a) {}
}

编辑:以上不是你问的,是的删除操作符被调用,http://www.cplusplus.com/reference/new/operator%20delete[] 说:

“这些释放函数由 delete 表达式和 new 表达式调用,以在破坏(或未能构造)具有动态存储持续时间的对象后释放内存。”

这可以通过覆盖运算符 delete 来测试。

关于c++ - 如果分配的内存在构造函数抛出异常后被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137367/

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