Topic 42 of 91 8. Object-Oriented Programming in C++ Interactive Tutorial

Destructors in C++: Object Cleanup, Rules, and Execution Timing

8 mins read Last updated: 26 Sep 2026 20,254 views

Direct Answer & Core Concept

A destructor is a special member function (~ClassName) invoked automatically when an object goes out of scope or is deleted. It releases acquired resources (memory, file handles, sockets, mutex locks). In polymorphic hierarchies, base class destructors must be declared virtual to ensure derived class destructors execute during deletion through a base pointer.

Detailed Explanation & Mechanics

1. Destructor Execution Order:

  • Construction order: Base class constructor -> Member objects -> Derived class constructor.
  • Destruction order: EXACT REVERSE. Derived class destructor -> Member objects -> Base class destructor.
Architecture Diagram
DESTRUCTION TIMELINE:
┌─────────────────────────────────────────────────────────────┐
│ 1. Derived Class Destructor body executes                   │
│ 2. Derived Class Member variables destroyed in reverse order│
│ 3. Base Class Destructor body executes                      │
│ 4. Base Class Member variables destroyed                    │
└─────────────────────────────────────────────────────────────┘

2. Virtual Destructor Requirement:

Deleting a derived object via a base pointer with a non-virtual destructor causes Undefined Behavior and memory leaks because the derived cleanup code is skipped.

Runnable Code Example: Destructors in C++

C++20 / C++23
main.cpp
Run Online
#include <iostream>
#include <memory>

class BaseResource {
public:
    BaseResource() { std::cout << "BaseResource acquired.\n"; }
    virtual ~BaseResource() { std::cout << "BaseResource released.\n"; }
};

class DerivedResource : public BaseResource {
private:
    int* rawBuffer;
public:
    DerivedResource() : rawBuffer(new int[100]) {
        std::cout << "DerivedResource buffer allocated (400 bytes).\n";
    }
    ~DerivedResource() override {
        delete[] rawBuffer;
        std::cout << "DerivedResource buffer deleted safely.\n";
    }
};

int main() {
    std::cout << "--- Polymorphic Deletion Demo ---\n";
    {
        std::unique_ptr<BaseResource> ptr = std::make_unique<DerivedResource>();
        // Exiting scope triggers virtual destructor chain: Derived -> Base
    }
    std::cout << "--- Scope exited cleanly ---\n";
    return 0;
}

Common C++ Technical Interview Questions & Answers

Interview Prep
Q

Q: Can a destructor be overloaded or take parameters in C++?

A: No, a destructor cannot take arguments, cannot return any value, and cannot be overloaded. There is only one destructor per class.
Q

Q: What happens if an exception escapes from a destructor during stack unwinding?

A: The C++ runtime immediately invokes std::terminate(), abruptly ending the application. Destructors are implicitly `noexcept` since C++11 and must never allow exceptions to escape.

Key Takeaways, Modern Best Practices & Idioms

C++ Best Practices & Production Rules

• Keep destructors noexcept and handle internal cleanup errors without throwing exceptions.
• Follow the Rule of Zero: let RAII member wrappers (smart pointers, vectors) manage cleanup automatically.
• Declare base class destructors either public virtual or protected non-virtual.
We value your privacy & transparency

OperateTools uses cookies and local storage to ensure basic tool functionality, preserve preferences, and analyze aggregated traffic. We never sell your personal data or index your document files. Learn more in our Privacy Policy.