A destructor runs automatically when an object is destroyed.

destructor A destructor starts with `~` and usually releases or closes something owned by the object.

Destructors

label
destructors.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

class Tracker {
private:
    std::string label;

public:
    Tracker(std::string name) {
        label = name;
        std::cout << "create=" << label << std::endl;
    }

    ~Tracker() {
        std::cout << "destroy=" << label << std::endl;
    }

    void use() {
        std::cout << "use=" << label << std::endl;
    }
};

int main() {
    std::string label = "file";

    Tracker tracker(label);
    tracker.use();
    return 0;
}
#include <iostream>
#include <string>

class Tracker {
private:
    std::string label;

public:
    Tracker(std::string name) {
        label = name;
        std::cout << "create=" << label << std::endl;
    }

    ~Tracker() {
        std::cout << "destroy=" << label << std::endl;
    }

    void use() {
        std::cout << "use=" << label << std::endl;
    }
};

int main() {
    std::string label = "socket";

    Tracker tracker(label);
    tracker.use();
    return 0;
}
#include <iostream>
#include <string>

class Tracker {
private:
    std::string label;

public:
    Tracker(std::string name) {
        label = name;
        std::cout << "create=" << label << std::endl;
    }

    ~Tracker() {
        std::cout << "destroy=" << label << std::endl;
    }

    void use() {
        std::cout << "use=" << label << std::endl;
    }
};

int main() {
    std::string label = "image";

    Tracker tracker(label);
    tracker.use();
    return 0;
}
  1. label ← file

    23int main() {24    std::string label→ file = "file"; //@label="socket", "image"2526    Tracker tracker(labelfile);27    tracker.use();
  2. Tracker(std::string name)

    8public:9    Tracker(std::string namefile) {10        label = namefile;11        std::cout << "create=" << label << std::endl;12    }
    outputcreate=file
  3. tracker ← (empty)

    26Tracker tracker→ (empty)(labelfile);27tracker(empty).use();28return 0;
  4. void use()

    18void use() {19    std::cout << "use=" << label << std::endl;20}
    outputuse=file
  5. tracker.use();

    26    Tracker tracker(label);27    tracker(empty).use();28    return 0;29}
  6. ~Tracker()

    14~Tracker() {15    std::cout << "destroy=" << label << std::endl;16}
    outputdestroy=file
  1. label ← socket

    23int main() {24    std::string label→ socket = "socket";2526    Tracker tracker(labelsocket);27    tracker.use();
  2. Tracker(std::string name)

    8public:9    Tracker(std::string namesocket) {10        label = namesocket;11        std::cout << "create=" << label << std::endl;12    }
    outputcreate=socket
  3. tracker ← (empty)

    26Tracker tracker→ (empty)(labelsocket);27tracker(empty).use();28return 0;
  4. void use()

    18void use() {19    std::cout << "use=" << label << std::endl;20}
    outputuse=socket
  5. tracker.use();

    26    Tracker tracker(label);27    tracker(empty).use();28    return 0;29}
  6. ~Tracker()

    14~Tracker() {15    std::cout << "destroy=" << label << std::endl;16}
    outputdestroy=socket
  1. label ← image

    23int main() {24    std::string label→ image = "image";2526    Tracker tracker(labelimage);27    tracker.use();
  2. Tracker(std::string name)

    8public:9    Tracker(std::string nameimage) {10        label = nameimage;11        std::cout << "create=" << label << std::endl;12    }
    outputcreate=image
  3. tracker ← (empty)

    26Tracker tracker→ (empty)(labelimage);27tracker(empty).use();28return 0;
  4. void use()

    18void use() {19    std::cout << "use=" << label << std::endl;20}
    outputuse=image
  5. tracker.use();

    26    Tracker tracker(label);27    tracker(empty).use();28    return 0;29}
  6. ~Tracker()

    14~Tracker() {15    std::cout << "destroy=" << label << std::endl;16}
    outputdestroy=image