C++(智能指针)

发布时间 2023-12-08 13:24:44作者: 做梦当财神

在 C++ 中,智能指针是一种用于管理动态分配内存的智能化工具。它们提供了对动态分配资源的自动管理,以减少内存泄漏和资源泄漏的风险。C++ 标准库提供了两种主要的智能指针类型:std::shared_ptrstd::unique_ptr。以下是这两种智能指针的基本解释:

1. std::shared_ptr

std::shared_ptr 是一种共享拥有权的智能指针。多个 shared_ptr 可以同时共享同一块内存,并且当最后一个 shared_ptr 不再引用这块内存时,它会自动释放该内存。std::shared_ptr 使用引用计数来追踪内存的所有者数量。

#include <memory>

std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(42);
std::shared_ptr<int> sharedPtr2 = sharedPtr1; // 共享所有权

// 引用计数为 2

// 当 sharedPtr1 和 sharedPtr2 超出作用域时,引用计数减为 1
// 当最后一个 shared_ptr 超出作用域时,内存被释放

2. std::unique_ptr

std::unique_ptr 是一种独占拥有权的智能指针。每个 std::unique_ptr 指向唯一的对象,不能被复制或共享,但可以被移动。当 std::unique_ptr 超出作用域时,它所拥有的对象会被自动释放。

#include <memory>

std::unique_ptr<int> uniquePtr1 = std::make_unique<int>(42);
// std::unique_ptr<int> uniquePtr2 = uniquePtr1; // 错误,不能复制

// 当 uniquePtr1 超出作用域时,拥有的内存被释放

使用 std::shared_ptrstd::unique_ptr 的建议:

  • 如果可以使用 std::unique_ptr,则优先选择它,因为它更轻量且没有引用计数的开销。
  • 当需要多个智能指针共享同一块内存时,使用 std::shared_ptr
  • 避免使用裸指针进行内存管理,以减少内存泄漏和悬挂指针的风险。

这些智能指针的使用有助于更安全、更容易维护的 C++ 代码,减少手动内存管理的烦恼。