Ownership
Destructors
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
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;
}
label ← file
23int main() {24 std::string label→ file = "file"; //@label="socket", "image"2526 Tracker tracker(labelfile);27 tracker.use();Tracker(std::string name)
8public:9 Tracker(std::string namefile) {10 label = namefile;11 std::cout << "create=" << label << std::endl;12 }outputcreate=filetracker ← (empty)
26Tracker tracker→ (empty)(labelfile);27tracker(empty).use();28return 0;void use()
18void use() {19 std::cout << "use=" << label << std::endl;20}outputuse=filetracker.use();
26 Tracker tracker(label);27 tracker(empty).use();28 return 0;29}~Tracker()
14~Tracker() {15 std::cout << "destroy=" << label << std::endl;16}outputdestroy=file
label ← socket
23int main() {24 std::string label→ socket = "socket";2526 Tracker tracker(labelsocket);27 tracker.use();Tracker(std::string name)
8public:9 Tracker(std::string namesocket) {10 label = namesocket;11 std::cout << "create=" << label << std::endl;12 }outputcreate=sockettracker ← (empty)
26Tracker tracker→ (empty)(labelsocket);27tracker(empty).use();28return 0;void use()
18void use() {19 std::cout << "use=" << label << std::endl;20}outputuse=sockettracker.use();
26 Tracker tracker(label);27 tracker(empty).use();28 return 0;29}~Tracker()
14~Tracker() {15 std::cout << "destroy=" << label << std::endl;16}outputdestroy=socket
label ← image
23int main() {24 std::string label→ image = "image";2526 Tracker tracker(labelimage);27 tracker.use();Tracker(std::string name)
8public:9 Tracker(std::string nameimage) {10 label = nameimage;11 std::cout << "create=" << label << std::endl;12 }outputcreate=imagetracker ← (empty)
26Tracker tracker→ (empty)(labelimage);27tracker(empty).use();28return 0;void use()
18void use() {19 std::cout << "use=" << label << std::endl;20}outputuse=imagetracker.use();
26 Tracker tracker(label);27 tracker(empty).use();28 return 0;29}~Tracker()
14~Tracker() {15 std::cout << "destroy=" << label << std::endl;16}outputdestroy=image