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 @   海_纳百川  阅读(192)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2023-11-08 OpenCV透视变换-不对原图裁剪
2023-11-08 使用pillow对图像进行旋转和添加高斯白噪声
2022-11-08 IOU计算-纯python
2022-11-08 awk强势使用方法
本站总访问量8959108
 
点击右上角即可分享
微信分享提示