📌  相关文章
📜  auto_ptr,unique_ptr,shared_ptr和weak_ptr(1)

📅  最后修改于: 2023-12-03 15:13:33.447000             🧑  作者: Mango

智能指针介绍

1. auto_ptr

auto_ptr 是 C++98 标准中提供的智能指针,用于管理动态分配的资源的释放。然而,auto_ptr 存在一些问题,并在 C++11 标准中被废弃。

特点:
  • auto_ptr 拥有资源的唯一所有权。当 auto_ptr 被赋值给另一个 auto_ptr 或者销毁时,会自动释放已分配的内存。
  • 支持类似于原始指针的成员访问操作符 ->*
  • 不能共享所有权,不能在容器中使用。
  • 不是线程安全的。
示例代码:
#include <memory>

std::auto_ptr<int> ptr(new int(10));
std::cout << *ptr << std::endl;  // 输出: 10
2. unique_ptr

unique_ptr 是 C++11 标准中引入的智能指针,用于替代废弃的 auto_ptr

特点:
  • unique_ptr 同样也拥有资源的唯一所有权。当 unique_ptr 被赋值给另一个 unique_ptr 或者销毁时,会自动释放已分配的内存。
  • 支持类似于原始指针的成员访问操作符 ->*
  • 支持移动语义,可以转移所有权。
  • 支持自定义的删除器,用于释放不同类型的资源。
  • 可以在容器中使用。
  • 不是线程安全的。
示例代码:
#include <memory>

std::unique_ptr<int> ptr(new int(10));
std::cout << *ptr << std::endl;  // 输出: 10
3. shared_ptr

shared_ptr 是 C++11 标准中引入的智能指针,可以方便地实现共享资源所有权。

特点:
  • shared_ptr 允许多个 shared_ptr 指向同一块内存资源,当最后一个 shared_ptr 被销毁时,会自动释放内存资源。
  • 支持类似于原始指针的成员访问操作符 ->*
  • 支持自定义释放函数,适用于不同类型的资源。
  • 支持弱引用计数,可以通过 weak_ptr 判断是否资源已被释放。
  • 可以在容器中使用。
  • 不是线程安全的。
示例代码:
#include <memory>

std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1;
std::cout << *ptr2 << std::endl;  // 输出: 10
4. weak_ptr

weak_ptr 也是 C++11 标准中引入的智能指针,用于解决 shared_ptr 的循环引用问题。

特点:
  • weak_ptr 指向 shared_ptr 管理的对象,但并不拥有资源所有权。
  • weak_ptr 通过检查生命周期是否结束来判断资源是否已被释放。
  • weak_ptr 可以通过 lock 函数获取一个有效的 shared_ptr 对象,用于访问资源。
  • 不能直接使用 *-> 操作符访问资源,需要通过 lock() 转换为 shared_ptr 后使用。
  • 可以在容器中使用。
  • 不是线程安全的。
示例代码:
#include <memory>

std::shared_ptr<int> shared = std::make_shared<int>(10);
std::weak_ptr<int> weak(shared);

if (auto ptr = weak.lock()) {
    std::cout << *ptr << std::endl;  // 输出: 10
} else {
    std::cout << "资源已被释放" << std::endl;
}

以上就是auto_ptrunique_ptrshared_ptrweak_ptr四种智能指针的介绍。这些智能指针提供了更安全和方便的动态内存管理方式,可以有效地减少内存泄漏的风险。需要根据具体的情况选择合适的智能指针来管理资源。