Например, есть у нас класс Klass, в нем есть конструктор и деструктор:
class Klass{
public:
Klass(){cout<<"Konstructor";}
~Klass(){cout<<"Destructor";}
};
int main(){
Klass klass1;
Klass *klass2=new Klass();
}
Вывод:
KonstructorKonstructorDestructor
Почему простой объект вызвал деструктор, а указатель на объект - нет?
Сам указатель и объект, на который указатель указывает - это совершенно отдельные, независимые, самостоятельные сущности. Даже если бы у указателя и был деструктор, он бы все равно не имел никакого отношения к деструктору указуемого объекта.
Указатель в общем случае не имеет ни малейшего представления о том, когда и кем должен быть уничтожен указуемый объект. Например, на один и тот же объект могут указывать 100 указателей. Эти 100 указателей ничего друг о друге не знают. Если один из этих указателей заканчивает свое существование и вместе с собой вдруг вздумает уничтожить и указуемый объект, то куда после этого будут указывать остальные 99 указателей?
Например, пользуясь объявлениями из вашего примера
int main()
{
Klass *ptr1 = new Klass;
{
Klass *ptr2 = ptr1;
}
delete ptr1;
}
Когда заканчивается время жизни указателя ptr2, откуда он может знать, нужно ли ему уничтожать указуемый объект? Знать этого он не может никак.
У указателей тривиальные деструкторы по историческим причинам. Сделать деструктор указателя не тривиальным и удалять в нем объект, на который указывает указатель не возможно по следующим причинам:
{
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
вы создали обьект в динамической области памяти. Деструктор вызовется только после вашей команды:
delete klass2;
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости