(2)std::智能指针

1. std::shared_ptr: 一个共享所有权的智能指针, 多个 shared_ptr 可以共享同一个对象。

C++11 引入的智能指针之一,属于内存管理机制的核心工具。它通过引用计数(Reference Counting)实现对动态分配对象的自动内存管理,避免内存泄漏。

线程安全:
    shared_ptr 对象本身不是线程安全的(多个线程不能同时修改同一个 shared_ptr 变量)。
    但多个线程持有不同的 shared_ptr 副本指向同一对象是安全的。
    引用计数的操作是原子的。

auto ptr = std::make_shared<int>(42);   // 推荐
std::shared_ptr<int> ptr(new int(42));  // 不推荐
2. std::weak_ptr 是 C++11 引入的弱引用智能指针,它与 std::shared_ptr 配合使用,用于解决 shared_ptr 的循环引用问题,避免内存泄漏。

不增加引用计数。
auto sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp; 

检查对象是否还存在
if (!wp.expired()) {
    std::cout << "Object is still alive\n";
}

安全访问对象
auto obj = wp.lock(); // 返回 shared_ptr,
if (obj) { // 如果对象还存在, 引用计数 +1
    std::cout << "Value: " << *obj << std::endl;
} else {
    std::cout << "Object has been destroyed\n";
}

重置 weak_ptr
wp.reset(); // 断开连接
3. std::unique_ptr 是 C++11 引入的独占式智能指针,它保证同一时间只有一个 unique_ptr 拥有对动态资源的控制权,当它离开作用域时,所管理的对象会自动被删除,从而避免内存泄漏。

特点:
    不可复制(delete 了拷贝构造和赋值)。
    可以移动(move),所有权转移。
    轻量、高效、零运行时开销(与裸指针性能几乎相同)。
    原则:优先使用 unique_ptr,只有在需要共享时才用 shared_ptr。


std::unique_ptr<int> ptr1 = std::make_unique<int>(100);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 所有权从 ptr1 转移到 ptr2
if (!ptr1) {// ptr1 现在为 nullptr
    std::cout << "ptr1 is null\n";
}

std::unique_ptr<int> ptr3 = ptr2; // 编译错误!拷贝被删除

注意:
int* raw = ptr2.get(); // 获取原始指针,但不释放所有权
//不要手动 delete raw,否则 unique_ptr 析构时会双重释放。

数组支持
std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
arr[0] = 10;
arr[1] = 20;
// 自动调用 delete[],不是 delete


与 shared_ptr 的转换,反过来不行
std::unique_ptr<int> uptr = std::make_unique<int>(42);
std::shared_ptr<int> sptr = std::move(uptr); // unique_ptr → shared_ptr
posted @ 2018-06-21 15:01  osbreak  阅读(942)  评论(0)    收藏  举报