C++中的std::shared_ptr

std::shared_ptr 是 C++11 标准库中的智能指针类型,用于管理动态分配的对象。与传统指针不同,std::shared_ptr 自动管理内存,并在不再使用时自动释放对象,以避免内存泄漏。它是一种共享所有权的智能指针,即可以让多个 std::shared_ptr 指向同一个对象,并且会记录有多少个 std::shared_ptr 拥有该对象。

使用方法

#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> p1 = std::make_shared<int>(10);  // 创建一个指向整数10的shared_ptr
    std::cout << *p1 << std::endl;                        // 输出:10

    {
        std::shared_ptr<int> p2 = p1;                     // p2 共享 p1 所指向的对象
        std::cout << "Use count: " << p1.use_count() << std::endl;  // 输出:2
    }  // p2 离开作用域,引用计数减少

    std::cout << "Use count after p2 out of scope: " << p1.use_count() << std::endl;  // 输出:1
    return 0;
}

关键特性

  1. 引用计数:每一个 std::shared_ptr 对象都会维护一个引用计数。当创建新的 std::shared_ptr 指向相同对象时,引用计数增加;当某个 std::shared_ptr 被销毁时,引用计数减少。当引用计数为 0 时,std::shared_ptr 会自动释放对象的内存。
    • 可以通过 use_count() 获取当前的引用计数。
  2. 线程安全:多个 std::shared_ptr 指向同一对象时,引用计数操作是线程安全的。
  3. 支持自定义删除器std::shared_ptr 可以在创建时指定删除器函数,用于释放资源时执行特定操作。

常见操作

  • 创建 std::shared_ptr
    • 推荐使用 std::make_shared<T>(args...) 以提高效率。
    • 直接使用 new 创建时,需要传递给 std::shared_ptr<T> 构造函数,如 std::shared_ptr<int> p(new int(10));
  • 访问和修改对象
    • 使用 * 和 -> 操作符访问所指向的对象,如 *p1 或 p1->someMethod()
  • 检查引用计数
    • 使用 p1.use_count() 获取当前引用计数。

适用场景

std::shared_ptr 适合在多个地方需要共享同一个对象时使用,如在函数之间传递、容器存储等。需要注意的是,如果两个 std::shared_ptr 相互引用,可能导致内存无法释放(循环引用),此时可以配合 std::weak_ptr 来解决。

 
posted @ 2024-11-08 23:06  海_纳百川  阅读(330)  评论(0)    收藏  举报
本站总访问量