When we define a `Base` type pointer and the pointer points to `Derived`, things are different. The `~Derived()` is not called. ```c++ class Base { public: Base() { std::cout << "Base constructor called\n"; } ~Base() { std::cout << "Base deconstructor called\n"; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called\n"; } ~Derived() { std::cout << "Derived deconstructor called\n"; } }; int main() { Base* b = new Derived(); delete b; }
output:
1 2 3
Base constructor called Derived constructor called Base deconstructor called
This is when we might have memory leak in C++. Suppose we have data created in Derived, the destructor is responsible for cleaning up the memeory, however, it never gets called.