当构造函数引发异常时,如何在构造函数中分配内存

How is memory allocated in constructor released when the constructor throws an exception?

本文关键字:构造函数 分配 内存 异常      更新时间:2023-10-16

以下是我的示例代码。基类的指针是使用新操作员从Heap分配的内存。我明确地抛出了例外。由于我没有在 *ptr上调用DELETE,因此未发布新的内存。由于该对象不是完全构造的,我们如何发布内存?

#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;
}

当基础构造器引发异常时,控件会捕获块并处理异常。但是ptr = new A();分配的内存是如何发布的?

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

此外,我想知道如何关闭文件处理程序的文件处理程序,在构造函数和构造函数中开放了一个例外?

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

ptr关联的内存永远不会发布!

是的,这总是一个问题。

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