#include <iostream>
#include <memory>

struct Trace {
    int value;
    explicit Trace(int initial) : value{initial} {}
    ~Trace() {
        std::cout << "destroy " << value << '\n';
    }
};

int main() {
    auto first = std::make_shared<Trace>(7);
    {
        auto second = first;
        std::cout << "owners " << first.use_count() << '\n';
        first.reset();
        std::cout << "remaining " << second->value << ' ' << second.use_count() << '\n';
    }
    std::cout << "done\n";
    return 0;
}
