c ++ operator new如何在内部工作

时间:2016-11-04 11:41:15

标签: 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还是分配内存?那么,如果分配是第一个,如果有异常将如何处理解除分配?其他的,如果构建A是第一个,它是如何复制到堆中的?

2 个答案:

答案 0 :(得分:4)

  1. 分配内存。
  2. 调用A的构造函数。
  3. A的构造函数调用B的构造函数。
  4. A的构造函数。
  5. 作为标准异常处理程序的一部分,B的析构函数被调用(工作中的RAII)。
  6. 堆栈展开给调用者(main)。
  7. 释放内存(因为该对象未成功构建)。
  8. A的析构函数未被调用,因为对象未完全构造。但是, 完全构造的成员仍然被破坏。

    自动释放内存的方式与控件离开块时局部变量被破坏的方式非常相似。如果您熟悉Java和/或C#,请将其视为不可见的try-finally构造。或者一系列这样的结构。

答案 1 :(得分:0)

  

首先是什么:构建cordova.plugins.certificates.trustUnsecureCerts(true);或在堆中分配内存?

除非有内存,否则没有可以构造对象的空间。内存分配总是先行;然后代码继续初始化。这适用于所有类型的内存分配,而不仅仅是动态变量,因为构造函数在开始初始化对象之前需要有一个有效的A地址。

  

如果分配是第一个,如果有异常,将如何处理解除分配?

编译器会发出处理“魔法”的特殊代码。此代码将为所有基类和this等成员运行析构函数,这些成员在代码输入B的构造函数时已完全构造。