Ниже приведен мой пример кода. Базовый класс имеет указатель класса A с памятью, назначенной из кучи с помощью оператора new. Я явно выбрасываю исключение. Так как я не вызываю delete на * ptr, память, выделенная новым, не освобождается. Поскольку объект не построен полностью, как мы можем освободить память?
#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();
}