首页 > 编程语言 >C++(智能指针)

C++(智能指针)

时间:2023-12-08 13:35:01浏览次数:31  
标签:std C++ 智能 内存 shared unique ptr 指针

在 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++ 代码,减少手动内存管理的烦恼。



标签:std,C++,智能,内存,shared,unique,ptr,指针
From: https://www.cnblogs.com/keye/p/17885949.html

相关文章

  • ACPM高效C++组件管理让音视频终端SDK性能更好、稳定性更高
    本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构、技术性能、开发能效和最佳实践,一起开启音视频的开发之旅。本文为MediaBox技术架构篇,重点从 ACPM介绍、技术架构以及高效管理等方面,介绍如何通过MediaBoxACPM的高效组件管理,来提升音视频终端SDK......
  • C++(template)
    这是C++中的模板声明,用于定义一个通用的模板(template)。这种模板可以用于创建通用的、类型无关的代码,使得可以在不同的数据类型上使用相同的算法或数据结构。具体而言,template关键字声明了一个模板,typenameT则是模板参数声明,表示一个未知的类型T,可以在模板的定义中使用T代......
  • C++(extern)
    在C++中,extern是一个关键字,用于说明某个变量或函数是在其他文件中定义的,而不是在当前文件中定义。extern的主要作用是进行外部链接性的声明。1.外部变量的声明:extern可以用于声明在其他文件中定义的全局变量,以便在当前文件中使用这些变量。//文件1.cppintglobalVariab......
  • C++(双冒号 :: )
    在C++中,双冒号::是作用域操作符(ScopeResolutionOperator)。它有两个主要用途:命名空间的使用:在例子中,seeta::ModelSetting表示ModelSetting类位于seeta命名空间中。命名空间用于组织代码,以防止命名冲突。通过::操作符,你可以指定在哪个命名空间中查找相应的标识符(类、......
  • C++(默认参数、占位参数)
    在C++中,函数默认参数和占位参数都是用于提供函数参数的一些默认值或占位符,从而增加函数的灵活性。默认参数(DefaultParameters):在C++中,可以为函数的一个或多个参数提供默认值。这意味着调用函数时,如果没有提供相应的实参,将使用默认值。默认参数必须从函数声明开始定义,然后只......
  • Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码
    一、前言逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以通过在缓存中的数据往前移动往后移动即可。这样就要求做一个比较大的缓存队列,占用一定的内存是......
  • Qt6 c++教程1简介
    1Qt6简介Qt一个跨平台应用程序开发框架,旨在为桌面、嵌入式和移动平台创建具有统一用户界面(UI)的优秀软件应用程序。它为开发人员设计和构建优秀应用程序提供了一套强大的工具,而无需担心平台依赖性。本章主要内容:Qt介绍使用Qt的原因下载和安装Qt从源代码构建Qt61.1Qt简......
  • C++随机数
    C++中产生随机数的方式有产生一个随机数和产生一系列不重复的随机数两种方式;1.产生单个随机数通过rand()函数,需要先设置不同随机数种子,否则后面生成的每个随机数都一样,在此可以使用当前的时间作为种子。#include<cstdlib>#include<random>srand((unsigne......
  • 血糖仪_智能血糖检测仪定制_基于联发科MT8788血糖仪方案
    糖尿病早期并没有任何症状,往往不经过检查很难发现自己已经到达高血糖状态。对于父母而言,频繁去医院做检查既耗费时间又花费高昂,因此他们可能无法经常前往医院。然而,随着便携式血糖仪的出现,糖尿病患者现在可以实现简单方便的血糖监测,而无需离开家门。这种血糖检测仪器不仅可......
  • C++socket服务器与客户端简单通信流程
    服务器和客户端简单通信的流程,做一个简单的复习:1.服务器创建的流程代码如下,各个重要函数已经写注释:#include<iostream>//推荐加上宏定义#defineWIN32_LEAN_AND_MEAN#include<winsock2.h>#include<Windows.h>#pragmacomment(lib,"ws2_32")usingnamespacestd;i......