gpt4 book ai didi

c++ - 什么时候对象正好是 "created"?

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:22 25 4
gpt4 key购买 nike

假设我们有一些带有构造函数的类:

class MyClass
{
public:
MyClass()
{
//our code goes here
throw "OMG";//well, some code that throws an exception
}
};

现在,当发生异常时,正在执行堆栈展开。我还知道,如果构造函数抛出异常,则不会调用相应对象的析构函数,因为对象从来没有在一开始就被完全“创建”。

我对此有点困惑。对我来说,这意味着只有当构造函数完成时,对象才被认为是“创建的”。但显然,所有内存都是在调用构造函数之前(或紧接着)在某个位置分配的,因为我们可以在构造函数内操作对象的成员。

那么对象到底是什么时候在内存中创建的,导致异常的对象的内存发生了什么变化?

最佳答案

内存在构造函数体之前分配。

如果构造函数失败,自动分配内存被释放

并且“自动分配”的重音很重要 - 如果您在构造函数中动态分配了内存并且构造函数失败(例如,您可能在 之前使用了 new throw "OMG"), 这个内存会泄漏。

那是因为 - 你已经分配了这 block 内存,你需要释放它。

你是对的,没有调用析构函数,但析构函数不是释放内存的析构函数,分配给类的 auto 成员。
它(基本上)用于释放内存,由用户(在构造函数中或其他地方)分配。


换句话说,为对象分配内存不同于对象的构造。

另一个例子——如果你动态创建一个对象,比如:

MyObj* = new MyObj;

这将:

  • 调用operator new
  • 然后调用MyObj的构造函数>

看,两者是不同的。

关于c++ - 什么时候对象正好是 "created"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12087472/

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