Почему деструктор не вызывается, когда я объявляю указатель на объект - PullRequest
0 голосов
/ 13 июня 2019

Я заметил, что деструктор не вызывается, когда я объявляю указатель на объект, когда программа заканчивается. Вот код, который я пробовал:

class B {
    public:
        B(){cout<<"cons B;";    };
        B(const B &b ){cout<<"copy B;"; };
       ~B(){cout<<"Destr B;";   };

 };

class Y:public B {
public:
    Y(){cout<<"cons Y;";    };
    Y(const Y &y ){cout<<"copy Y;"; };
    ~Y(){cout<<"Destr Y;";  };

};


int main(){
   Y *y= new Y;
   f(y);
}

Деструктор не вызывается, результат: cons B cons Y С другой стороны, если я запускаю этот код:

Y y;

Деструктор вызывается, результат: cons B cons Y dest Y dest B

У меня вопрос, почему деструктор не вызывается в первой программе?

Ответы [ 3 ]

1 голос
/ 14 июня 2019

Деструктор объекта вызывается при уничтожении объекта, а не при выходе из программы.В своем коде вы никогда не уничтожаете объект.

Вы случайно создали утечку памяти.

Уничтожить объект, когда вы закончите с ним или перед выходом из приложения, и будет вызван его деструктор.

int main(){
   Y *y= new Y;
   f(y);
   delete y;
}
0 голосов
/ 14 июня 2019

Легко забыть, что у вас нет сборщика мусора, если вы переходите с языка более высокого уровня.Практическое правило заключается в том, что всякий раз, когда вы используете new, используйте delete, когда закончите.Указатель будет существовать даже после завершения функции, или в вашем случае программа закончится.Их использование будет функцией, которая генерирует некоторые данные, скажем, моделью.Если вы используете указатель, вы можете продолжать использовать эту модель после завершения функции и освобождения ее стека.Будьте осторожны с указателями и убедитесь, что они иногда удаляются, это не обязательно должно быть в одной и той же функции.

Указатель похож на депозитный ящик.Вы можете инициализировать один и перейти к нему, разыменовав его и изменив его содержимое.Вы также можете передать ячейку для депозита другим людям и позволить им изменять и просматривать тот же контент, что и вы, в отличие от простого предоставления им копии всего содержимого.Депозитная ячейка останется существующей после того, как человек, впервые создавший ее, пройдет, поскольку другие люди также могут использовать и редактировать ее содержимое.

0 голосов
/ 14 июня 2019

Вы создали объект класса в куче, используя оператор new. В куче всякий раз, когда мы создаем объект, мы несем ответственность за удаление динамически создаваемой памяти.Поэтому нам нужно явно вызвать delete, чтобы освободить память, когда мы используем delete, он вызовет деструктор.

...