首页 > 编程语言 >C++中的std::shared_ptr

C++中的std::shared_ptr

时间:2024-11-08 22:57:07浏览次数:1  
标签:std p1 计数 引用 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 来解决。

 

标签:std,p1,计数,引用,shared,ptr
From: https://www.cnblogs.com/chentiao/p/18536092

相关文章

  • OSS和FastDFS的区别
    FastDFS:FastDFS是一种开源的轻量级分布式文件系统,基于HTTP协议实现。具有高扩展性、高可用性和高稳定性。它解决了大容量文件存储和高效访问的问题,适合作为大容量文件的存储服务器。FastDFS通过文件系统集群,使得用户可以将文件存储在多台服务器上,而无需关心文件的实际存......
  • C# 中的 IntPtr
    C#中的IntPtrIntPtr是C#中用于表示指针或句柄的结构,它在处理非托管代码、与WindowsAPI交互或管理非托管资源时非常有用。IntPtr是一个平台无关的类型,能够在32位和64位系统之间自适应,通常用于存储指针地址或句柄。特点平台无关性:IntPtr在32位和64位应用程序......
  • 并发编程(8)—— std::async、std::future 源码解析
    文章目录八、day81.std::async2.std::future2.1wait()2.2get()八、day8之前说过,std::async内部的处理逻辑和std::thread相似,而且std::async和std::future有密不可分的联系。今天,通过对std::async和std::future源码进行解析,了解二者的处理逻辑和关系。源码均基......
  • 【网络安全渗透测试零基础入门】Vulnhub靶机Kioptrix level-4 多种姿势渗透详解,收藏这
    前言这是阳哥给粉丝盆友们整理的网络安全渗透测试入门阶段Vulnhub靶场实战阶段教程喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。环境配置服务版本探测:sudonmap-sT-sV-sC-O-p22,80,139,44522端口ssh服务以及openssh版本其他无特别信息80端口......
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
    文章目录前言1.auto关键字(C++11)1.1为什么要有auto关键字1.2auto关键字的使用方式1.3auto的使用细则1.4auto不能推导的场景2.基于范围的for循环(C++11)2.1范围for的语法2.2范围for的使用条件3.指针空值nullptr(C++11)3.1为什么会有nullptr这个关键字?前言本......
  • 深入理解 `std::shared_ptr`:原理、用法及其线程安全性
    在C++中,智能指针是现代内存管理的重要工具,尤其是在复杂的多线程环境中,能显著减少内存泄漏和悬空指针等问题。std::shared_ptr是C++11引入的一种共享智能指针,通过引用计数机制管理对象的生命周期。本文将详细介绍std::shared_ptr的基本用法、循环引用问题、线程安全性及其局......
  • 【C++】reference to ‘prev‘ is ambiguous:std 命名空间冲突引发的编译错误
    问题描述C++代码编译错误:usingnamespacestd;usingll=longlong;constintN=1e6+7;llprev[N];原因分析在C++的标准库中,std命名空间包含一个名为std::prev的函数,该函数用于获取容器中的前一个迭代器。在上述代码中,通过usingnamespacestd;语句,所......
  • averaged_perceptron_tagger_eng模块
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注......
  • C++ 手撕--共享式智能指针(shared_ptr)的简单实现
    C++手撕--共享式智能指针(shared_ptr)的简单实现共享式智能指针(shared_ptr):#include<iostream>#include<mutex>usingnamespacestd;template<typenameT>classShared_ptr{private:T*ptr;int*ref_count;std::mutex*mtx;voidrelease(){......
  • gofastdfs
    私有化目前部署了3台,如189.22,部署在/data/godfs启动进程 fileserver数据存储 files配置文件 conf日志log Nginx部署在189.10,路径:/etc/nginx转发配置nginx.conf及 conf.d下的文件nginx.conf中包含了全局的配置,如http块等conf.d下的文件包含各个转发的配置g......