gpt4 book ai didi

c++ operator new 这在内部是如何工作的

转载 作者:行者123 更新时间:2023-11-30 01:41:58 25 4
gpt4 key购买 nike

例如我有一个简单的代码:

class B
{
};

class A
{
B b;
public:
A()
{
throw 1;
}
};

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

构造函数A抛出异常,则不会调用析构函数。但是 B 的析构函数将被调用。不会分配堆中的内存。我的问题是这在内部如何运作?首先是什么:构造 A 还是在堆中分配内存?那么,如果allocating是第一个,如果有exception怎么处理deallocating呢?否则,如果构造 A 是第一个,它是如何复制到堆中的?

最佳答案

  1. 内存已分配。
  2. A的构造函数被调用。
  3. A的构造函数调用B的构造函数。
  4. A 的构造函数抛出。
  5. 作为标准异常处理程序的一部分,B 的析构函数被调用(RAII 在工作)。
  6. 堆栈展开到调用者(main)。
  7. 内存已释放(因为对象未成功构造)。

A 的析构函数未被调用,因为该对象未完全构造。但是, 完全构建的成员仍然被破坏。

当控件离开 block 时,内存会以与局部变量被销毁的方式几乎相同的方式自动释放。如果您熟悉 Java 和/或 C#,可以将其视为不可见的 try-finally 结构。或者一系列这样的结构。

关于c++ operator new 这在内部是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40421791/

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