gpt4 book ai didi

c++ - 谁删除了在构造函数中有异常的 "new"操作期间分配的内存?

转载 作者:IT老高 更新时间:2023-10-28 13:57:32 26 4
gpt4 key购买 nike

我真的不敢相信我找不到一个明确的答案......

在使用 new 操作符初始化的情况下,如何释放 C++ 类构造函数引发异常后分配的内存。例如:

class Blah
{
public:
Blah()
{
throw "oops";
}
};

void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}

当我尝试这个时,b 在 catch block 中为 NULL(这是有道理的)。

在调试时,我注意到控制在到达构造函数之前进入了内存分配例程。

MSDN 网站上的 seems to confirm this :

When new is used to allocate memory for a C++ class object, the object's constructor is called after the memory is allocated.

所以,记住局部变量 b 永远不会被分配(即在 catch block 中为 NULL)如何删除分配的内存?

如果能得到一个跨平台的答案也很好。即,C++ 规范是怎么说的?

澄清:我不是在谈论类在 c'tor 中分​​配内存然后抛出的情况。我很感激在这些情况下不会调用 d'tor。我说的是用于分配 THE 对象的内存(在我的例子中是 Blah)。

最佳答案

你应该引用类似的问题 herehere .基本上,如果构造函数抛出异常,您可以安全地再次释放对象本身的内存。虽然,如果在构造函数期间已经占用了其他内存,则您必须自己释放它,然后才能将构造函数排除在异常之外。

对于您的问题,谁删除了内存,答案是 new-operator 背后的代码(由编译器生成)。如果它识别出一个离开构造函数的异常,它必须调用类成员的所有析构函数(因为在调用构造函数代码之前已经成功构造了这些析构函数)并释放它们的内存(可以与析构函数调用一起递归完成,很可能通过对它们调用适当的delete)以及释放为此类本身分配的内存。然后它必须将捕获的异常从构造函数重新抛出到 new 的调用者。当然可能还有更多工作要做,但我无法从脑海中抽出所有细节,因为它们取决于每个编译器的实现。

关于c++ - 谁删除了在构造函数中有异常的 "new"操作期间分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1674980/

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