1. 智能指针的思想来源

2. 唯一指针 std::unique_ptr

#include <iostream>
#include <memory>

struct MyData {
    int value;
    MyData(int v) : value(v) {}
    void print() const {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    std::unique_ptr<MyData> u_ptr1(10); // 创建 unique_ptr
    u_ptr1->print(); // 通过 -> 访问成员
    // std::unique_ptr<MyData> u_ptr2 = u_ptr1; // 编译错误:unique_ptr 不可复制
    std::unique_ptr<MyData> u_ptr3 = std::move(u_ptr1); // 转移所有权,u_ptr1 现在为空
}

3. 共享指针 std::shared_ptr

#include <iostream>
#include <memory>
#include <vector>

struct SharedResource {
    int id;
    SharedResource(int i) : id(i) {}
};

int main() {
    std::shared_ptr<SharedResource> s_ptr1(101);  // 创建 shared_ptr
    std::cout << "s_ptr1 use_count: " << s_ptr1.use_count() << std::endl; // 输出 1

    std::shared_ptr<SharedResource> s_ptr2 = s_ptr1; // 拷贝构造,引用计数增加
    std::cout << "s_ptr1 use_count: " << s_ptr1.use_count() << std::endl; // 输出 2
    std::cout << "s_ptr2 use_count: " << s_ptr2.use_count() << std::endl; // 输出 2

    std::vector<std::shared_ptr<SharedResource>> ptr_vector;
    ptr_vector.push_back(s_ptr1);
    ptr_vector.push_back(s_ptr2);
    ptr_vector.push_back(std::make_shared<SharedResource>(202));

    std::cout << "s_ptr1 use_count after vector push: " << s_ptr1.use_count() << std::endl; // 输出 4 (s_ptr1, s_ptr2, vector[0], vector[1])
    std::cout << "ptr_vector[2] use_count: " << ptr_vector[2].use_count() << std::endl; // 输出 1

    s_ptr1.reset(); // s_ptr1 不再指向对象,引用计数减少
    std::cout << "After s_ptr1.reset(), s_ptr2 use_count: " << s_ptr2.use_count() << std::endl; // 输出 3

    ptr_vector.clear(); // vector 中的 shared_ptr 被销毁,引用计数相应减少
    std::cout << "After vector.clear(), s_ptr2 use_count: " << s_ptr2.use_count() << std::endl; // 输出 1

    // s_ptr2 在 main 函数结束时离开作用域,引用计数变为 0,SharedResource(101) 被销毁
    // SharedResource(202) 在 ptr_vector.clear() 后引用计数变为 0 并被销毁
    return 0;
}