#include <iostream>
#include <memory>

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

int main() {
    auto owner = std::make_unique<Trace>(9);
    std::cout << "owned " << owner->value << '\n';
    owner.reset(new Trace{4});
    std::cout << "owned " << owner->value << '\n';
    Trace* raw = owner.release();
    std::cout << "empty " << (owner == nullptr) << '\n';
    std::cout << "raw " << raw->value << '\n';
    delete raw;
    return 0;
}
