Деструктор и указатель на объект

347
10 февраля 2019, 09:30

Например, есть у нас класс Klass, в нем есть конструктор и деструктор:

class Klass{
public:
    Klass(){cout<<"Konstructor";}
    ~Klass(){cout<<"Destructor";}
};
int main(){
    Klass klass1;
    Klass *klass2=new Klass();
}

Вывод:

KonstructorKonstructorDestructor 

Почему простой объект вызвал деструктор, а указатель на объект - нет?

Answer 1

Сам указатель и объект, на который указатель указывает - это совершенно отдельные, независимые, самостоятельные сущности. Даже если бы у указателя и был деструктор, он бы все равно не имел никакого отношения к деструктору указуемого объекта.

Указатель в общем случае не имеет ни малейшего представления о том, когда и кем должен быть уничтожен указуемый объект. Например, на один и тот же объект могут указывать 100 указателей. Эти 100 указателей ничего друг о друге не знают. Если один из этих указателей заканчивает свое существование и вместе с собой вдруг вздумает уничтожить и указуемый объект, то куда после этого будут указывать остальные 99 указателей?

Например, пользуясь объявлениями из вашего примера

int main()
{
   Klass *ptr1 = new Klass;
   {
     Klass *ptr2 = ptr1;   
   } 
   delete ptr1;
}

Когда заканчивается время жизни указателя ptr2, откуда он может знать, нужно ли ему уничтожать указуемый объект? Знать этого он не может никак.

Answer 2

У указателей тривиальные деструкторы по историческим причинам. Сделать деструктор указателя не тривиальным и удалять в нем объект, на который указывает указатель не возможно по следующим причинам:

  • указатель не обязательно владеет объектом, на который указывает
{
    int val{};
    int * p_val{&val};
} // автоматический вызов delete p_val вызвал бы UB
  • даже если указатель владеет объектом, на который он указывает, то этот объект может быть создан каким угодно способом, а не только с помощью new
{
    int * p_val{static_cast<int *>(::std::malloc(sizeof(int)))};
} // автоматический вызов delete p_val вызвал бы UB
Answer 3

вы создали обьект в динамической области памяти. Деструктор вызовется только после вашей команды:

 delete klass2;
READ ALSO
Как сделать что бы матрица стала сходящаяся?

Как сделать что бы матрица стала сходящаяся?

В задание надо решить матрицу методом простой итерацииЯ все написал но для некоторых матриц это не подходит и преподователь сказал сделать...

250
SHGetPathFromIDListW Плчему получаю только один символ?

SHGetPathFromIDListW Плчему получаю только один символ?

Нужно получить путь к папкеИспользую структуру BROWSEINFO и функцию SHBrowseForFolder()

265
Qt-QString в int

Qt-QString в int

Как конвертировать:

225
Передача полей класса в методы класса

Передача полей класса в методы класса

Для большей читабельности кода пришел к мысли что хорошо бы передавать поля класса в методы класса явноТ

267