Как выделяется память в конструкторе, когда конструктор выдает исключение? - PullRequest
3 голосов
/ 21 марта 2019

Ниже приведен мой пример кода. Базовый класс имеет указатель класса 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();
}

1 Ответ

5 голосов
/ 21 марта 2019

Память, связанная с ptr, никогда не освобождается!

Да, это всегда было проблемой.

До C ++ 11 вы могли создать свой собственный класс интеллектуальных указателей (илииспользуйте, например, в Boost), или позаботьтесь о delete, прежде чем выдавать исключение.Помещение ptr в базовый класс также является альтернативой: конструктор базового класса завершит работу до того, как будет достигнуто тело функции производного конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...