C++
Beginner
1 min read
shared_ptr and Reference Counting
Example
#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\n";
}
~Resource() {
std::cout << "Resource '" << name << "' released\n";
}
};
void useResource(std::shared_ptr<Resource> r) {
std::cout << "Using: " << r->name
<< " (use_count=" << r.use_count() << ")\n";
}
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() << "\n"; // 1
{
auto r2 = r1; // shared ownership — count becomes 2
std::cout << "r1 use_count = " << r1.use_count() << "\n"; // 2
useResource(r2); // count temporarily 3 inside function
std::cout << "r1 use_count = " << r1.use_count() << "\n"; // 2
}
// r2 out of scope — count back to 1
std::cout << "r1 use_count = " << r1.use_count() << "\n"; // 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() << "\n"; // 3
holders.clear(); // removes two shares
std::cout << "use_count after clear = " << r1.use_count() << "\n"; // 1
return 0; // Resource released here
}