Back
Syntax
Study
Editor
Mode:
HTML
CSS
JavaScript
PHP
Reset
Run »
HTML / CSS / JS
#include <iostream> #include <memory> #include <string> #include <vector> struct Resource { std::string name; explicit Resource(std::string n) : name(std::move(n)) { std::cout << "Resource '" << name << "' acquired "; } ~Resource() { std::cout << "Resource '" << name << "' released "; } }; void useResource(std::shared_ptr<Resource> r) { std::cout << "Using: " << r->name << " (use_count=" << r.use_count() << ") "; } int main() { // make_shared: single allocation for object + control block auto r1 = std::make_shared<Resource>("Database"); std::cout << "r1 use_count = " << r1.use_count() << " "; // 1 { auto r2 = r1; // shared ownership — count becomes 2 std::cout << "r1 use_count = " << r1.use_count() << " "; // 2 useResource(r2); // count temporarily 3 inside function std::cout << "r1 use_count = " << r1.use_count() << " "; // 2 } // r2 out of scope — count back to 1 std::cout << "r1 use_count = " << r1.use_count() << " "; // 1 // Vector of shared_ptrs — all share the same Resource std::vector<std::shared_ptr<Resource>> holders; holders.push_back(r1); holders.push_back(r1); std::cout << "use_count with vector = " << r1.use_count() << " "; // 3 holders.clear(); // removes two shares std::cout << "use_count after clear = " << r1.use_count() << " "; // 1 return 0; // Resource released here }
Result
Open