c++操作符的内部工作原理
c++ operator new how this works internally
例如我有一个简单的代码:
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是第一个,它是如何复制到堆的?
- 内存分配完成。
- 调用A的构造函数 A的构造函数调用b的构造函数 A的构造函数抛出。作为标准异常处理过程的一部分,B的析构函数被称为(工作中的RAII)。
- 堆栈unwind到调用者(main)。
- 内存被释放(因为对象没有成功构造)。
内存被自动释放,就像控制离开块时局部变量被销毁一样。如果您熟悉Java和/或c#,可以将其视为不可见的try-finally
结构。或者一系列这样的结构
先做什么:构造
A
还是在堆中分配内存?
除非有内存,否则没有空间可以构造对象。内存分配总是优先;然后代码继续进行初始化。这适用于所有类型的内存分配,而不仅仅是动态的,因为构造函数在开始初始化对象之前需要有一个有效的this
地址。
如果分配是第一位的,如果出现异常,如何处理分配?
编译器发出特殊的代码来处理这里的"魔法"。这段代码将为所有基类和成员(如B
)运行析构函数,这些成员在代码进入A
的构造函数时已经完全构造好了。
相关文章:
- C++代码停止工作错误使用cout内部函数
- std::strlen 在内部是如何工作的?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 指向C++中成员的指针如何在内部工作?
- 删除和删除[]在内部如何工作?
- C 功能如何内部工作
- 自动参数如何在内部工作
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 函数指针仅在 main 内部工作
- 不要在心理上理解这个内部循环是如何工作的
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- (c++)无法让 void 函数工作,主.cpp内部的几行也有问题
- 为什么SFINAE(enable_if)从类定义内部工作而不是从外部工作
- 如何将负数转换为更广泛的类型在内部工作
- c++运算符=工作异常(函数内部输出正常,但返回后错误)
- std::remove_const 如何在<T>内部工作
- 如何与CUDA中的结构内部结构一起工作
- C++:析构函数内部如何工作以及谁调用默认析构函数
- Sendmessage在方法定义内部无法正常工作