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

标签 c++ new-operator

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

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/

相关文章:

c++ - 将字符数组作为参数发送到 C++ 中的函数

Java如何创建没有名称的类对象

c++ -::operator new(size_t) 是否使用 malloc()?

c++ - 运营商删除 - 如何实现?

c++ - 为什么在释放内存后使用的内存量仍然增加?

c++ - c++ 中的 malloc/free 和 new/delete 兼容性?

c++ - 使用字符串将文件名传递给 fstream

c++ - 将结构指针传递给带索引与不带索引的函数

C++ 输入验证

c++ - 编程快速排序算法 Q