Рассмотрим следующий код:
#include <iostream>
struct A
{
A(){ };
~A(){ std::cout << "~A::A()" << std::endl; };
};
struct B: A { };
B *b = new B; //Doesn't produce any side-effect.
int main(){ }
Программа не производит никакого вывода, что означает, что деструктор не вызывается. Но если мы заменим тело деструктора спецификатором delete
, программа даже не будет компилироваться.
#include <iostream>
struct A
{
A(){ };
~A() = delete; //{ std::cout << "~A::A()" << std::endl; };
};
struct B: A { };
B *b = new B; //Error: use of deleted function
int main(){ }
из-за вызова удаленной функции. Это деструктор, который вызывается в этом случае. Почему существует такая разница?
Это не сработает, даже если мы конструктивно определяем конструктор B
:
#include <iostream>
struct A
{
A(){ };
~A() = delete; //{ std::cout << "~A::A()" << std::endl; };
};
struct B: A
{
B(){ };
};
B *b = new B;
int main(){ }