gpt4 book ai didi

c++ - 当构造函数抛出异常时,构造函数中分配的内存如何释放?

转载 作者:太空狗 更新时间:2023-10-29 20:33:26 24 4
gpt4 key购买 nike

下面是我的示例代码。基类有一个 A 类指针,使用 new 运算符从堆中分配内存。我明确抛出异常。因为我没有在 *ptr 上调用 delete,所以不会释放 new 分配的内存。既然对象没有构造完整,那我们怎么释放内存呢?

#include <iostream>

using namespace std;
class A
{
public:
A()
{
cout<<"A::ctor"<<endl;
}
~A()
{
cout<<"A::Dctor"<<endl;
}
};
class Base
{
public:
A *ptr;
Base()
{
ptr = new A();
cout<<"Base::Ctor"<<endl;
throw std::exception();
}
~Base()
{
delete ptr;
cout<<"Base::Dtor"<<endl;
}
};

int main()
{
try{
Base bobj;

}
catch(exception e)
{

cout<<e.what();
}

return 0;
}

当 Base 构造函数抛出异常时,控制转到 catch block 并处理异常。但是ptr = new A();分配的内存是如何释放的呢?

现在我知道使用智能指针可以解决问题。但在 C++11 之前,这种情况是如何处理的。

另外,我想知道我们如何关闭在构造函数中打开的文件处理程序和构造函数发生异常的文件处理程序?

Base()
{
ofstream myfile;
myfile.open("myfile.txt");
..........
throw std::exception();
}

~Base()
{
myfile.close();
}

最佳答案

ptr 关联的内存永远不会被释放!

是的,这一直是个问题。

在 C++11 之前,您可以构建自己的智能指针类(或者使用 Boost 中的智能指针类),或者在抛出异常之前注意delete。将 ptr 放在基类中也是一种替代方法:基类构造函数将在到达派生构造函数的函数体之前完成。

关于c++ - 当构造函数抛出异常时,构造函数中分配的内存如何释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55281193/

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