Как преодолеть утечку памяти при выдаче исключения из конструктора? - PullRequest
0 голосов
/ 13 июля 2020

Есть ли утечка памяти в этой программе, если да, то как решить эту проблему ??

#include<iostream>
using namespace std;
class A
{
    double a,b;
  public:
    A(double X,double Y)
    {
        try
        {
        a = X;
        b = Y;
            if(b==0)
            throw b;
            else
            cout <<"Division:"<<a/b<<endl;
        }
        catch (double z)
        {
            throw z;
        }
    }
      ~A()
        {
            cout<<"Object Destroyed"<<endl;
         }
 }; 
 int main()
 {
   try
   {
    A object(10,2);
    A object1(4,2);
    A object2(4,0);
   }
  catch(double a)
  {
    cout<<"Zero:"<<a<<endl;
  }
  return 0;
  }

Почему для Object2 не вызывается деструктор и как лучше всего генерировать исключение из конструктора, если есть ??

1 Ответ

1 голос
/ 13 июля 2020

Таким образом, вы не делаете никакого динамического распределения c, это все основано на стеке. Так что очистится приемлемо. Как вы знаете, ваш деструктор не делает ничего полезного.

Но обратите внимание, что throw в конструкторе не вызывает соответствующий деструктор, и если этот конструктор для object2 / имел / выполнил какое-либо распределение (которое вы хотели очистить в деструкторе) перед тем, как выбросить, тогда он может очень легко протечь. Но обратите внимание, что элементы с конструкторами и базовыми классами должны быть уничтожены. Правило состоит в том, что для каждого подобъекта, чье построение было / завершено / будет вызван соответствующий деструктор, но если бросить в середину этой функции конструктора, то он не будет завершен, и соответствующий деструктор не вызывается.

Это сложность использования throw в конструкторах - и необходимость либо защищать все с помощью буферов RAII, либо убирать в ловушке.

Здесь есть дополнительная информация о том, что дает, а что нет destructed: Какие деструкторы запускаются, когда конструктор выдает исключение?

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