当前位置: 首页 > news >正文

快速弄懂C++中的智能指针

智能指针是C++中的一个对象,它的行为类似于指针,但它提供了自动的内存管理功能。当智能指针超出作用域时(比如说在函数中使用智能指针指向了一个对象,当该函数结束时会自动销毁该对象),它会自动删除其所指向的对象,这样可以避免内存泄露。C++11及之后的标准库中提供了几种不同类型的智能指针,包括:

**在局部函数中创建了一个局部对象的话,在函数结束后局部对象会被自动释放,但是若创建的是一个new对象在不使用智能指针的情况下若在函数结束运行时没销毁就会造成内存泄漏。
**

  1. std::unique_ptr

    • 独占所指向的对象(即同一时间只能有一个unique_ptr指向一个给定的对象)。
    • 不能被复制,只能被移动。
    • unique_ptr超出作用域或被删除时,它所指向的对象也会被删除。
    • 通常用于表示唯一所有权的场景。
    std::unique_ptr<int> p1(new int(5));
    std::unique_ptr<int> p2 = std::move(p1); // p1现在为空,p2指向之前的对象
    
  2. std::shared_ptr

    • 允许多个shared_ptr指向同一个对象。
    • 使用引用计数来跟踪有多少shared_ptr指向同一个对象。
    • 当最后一个指向对象的shared_ptr被销毁时,对象会被删除。
    • 通常用于需要多个指针共享一个资源的场景。
    std::shared_ptr<int> p1 = std::make_shared<int>(5);
    std::shared_ptr<int> p2 = p1; // 两者指向同一个对象,引用计数增加
    
  3. std::weak_ptr

    • shared_ptr的伴侣,不会增加引用计数。
    • 用于解决shared_ptr可能引起的循环引用问题。
    • 必须从weak_ptr转换为shared_ptr才能访问其所指向的对象。
    std::shared_ptr<int> p1 = std::make_shared<int>(5);
    std::weak_ptr<int> wp = p1; // wp指向p1所指的对象,但不增加引用计数
    

使用建议

  • 尽量避免使用裸指针。如果需要动态分配内存,优先考虑使用智能指针。
  • 当对象的所有权需要被明确地传递时,使用unique_ptr
  • 当多个指针需要共享同一个对象时,使用shared_ptr
  • 当需要打破shared_ptr的循环引用时,使用weak_ptr

注意:虽然智能指针提供了自动的内存管理功能,但仍然需要注意不要在非智能指针和智能指针之间产生混淆,这可能导致未定义的行为或其他问题。

下面是每种智能指针的使用场景及其价值:

  1. std::unique_ptr

    • 使用场景:当你有一个对象,并且在任何时刻只有一个拥有者时使用。
    • 示例:数据库的连接池。当一个线程请求一个连接时,它从连接池中获得一个unique_ptr,该指针在这段时间内唯一地拥有这个连接。当线程完成工作并释放unique_ptr时,连接返回到连接池。
    • 价值:确保对象在其生命周期中只有一个拥有者,并且当unique_ptr离开作用域时,对象被自动删除,避免内存泄漏。
  2. std::shared_ptr

    • 使用场景:当你希望多个指针共同拥有一个对象时使用。
    • 示例:一个社交网络应用中的用户组。多个用户可以同时属于同一个组,所以这个组的实例被多个用户对象共享。当最后一个属于该组的用户被删除时,组也会被自动删除。
    • 价值:允许多个shared_ptr实例共享其管理的对象,并且当最后一个shared_ptr被销毁时,它们所管理的对象也会被自动删除。
  3. std::weak_ptr

    • 使用场景:当你想要持有一个对象的引用,但不想增加其引用计数时使用。这通常用于避免shared_ptr的循环引用问题。
    • 示例:家庭关系模型。父对象有一个shared_ptr指向子对象,而子对象有一个weak_ptr指向父对象。这样,即使父对象被删除,子对象不会因为循环引用而无法被正确地删除。
    • 价值:允许对象之间有一个不增加引用计数的连接,这在需要避免循环引用的场景中特别有用。

通过使用这些智能指针,C++开发者可以更加容易地管理内存,减少内存泄漏和其他内存管理错误。

相关文章:

快速弄懂C++中的智能指针

智能指针是C中的一个对象&#xff0c;它的行为类似于指针&#xff0c;但它提供了自动的内存管理功能。当智能指针超出作用域时&#xff08;比如说在函数中使用智能指针指向了一个对象&#xff0c;当该函数结束时会自动销毁该对象&#xff09;&#xff0c;它会自动删除其所指向的…...

C#调用C++ dll教程

文章目录 一、创建C dll项目二、C#程序员调用C dll三、C与C#数据类型对应基本数据类型对应表C指针类型与C#类型 在使用C#开发客户端时&#xff0c;有时需要调用C dll&#xff0c;本篇博客来介绍C#程序如何调用C dll。 一、创建C dll项目 首先使用VS2022创建C dll项目&#xf…...

计算机毕设 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要…...

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…...

运行软件报错mfc140.dll丢失?分享mfc140.dll丢失的解决方法

小伙伴们&#xff0c;你是否也有过这样的经历&#xff1a;每当碰到诸如" mfc140.dll 丢失 "之类的烦人错误时&#xff0c;你是不是会一头雾水&#xff0c;完全不知道从何下手去解决&#xff1f;不要担心&#xff0c;接下来咱就给你提供这样一篇实用教程&#xff0c;教…...

milvus数据库-连接

Milvus 支持 19530 和 9091 两个端口&#xff1a; 端口 19530 用于 gRPC 和 RESTful API。 这是您使用不同 Milvus SDK 或 HTTP 客户端连接到 Milvus 服务器时的默认端口。 端口 9091 用于 Kubernetes 内的指标收集、pprof 分析和运行状况探测。 它用作管理端口。 1.连接到数…...

ios + vue3 Teleport + inset 兼容性问题

目录 1&#xff0c;问题表现2&#xff0c;解决步骤1&#xff0c;teleport 的问题2&#xff0c;inset 的问题3&#xff0c;teleport 的问题之二 1&#xff0c;问题表现 使用 vue3 的 Teleport 实现的 dialog 弹窗&#xff0c;但是在 ios app 中嵌套的 h5 中无法打开。 直接在io…...

计蒜客T1654 数列分段(C语言实现)

【题目描述】对于给定的一个长度为n的正整数数列ai&#xff0c;现要将其分成连续的若干段&#xff0c;并且每段和不超过m&#xff08;可以等于m&#xff09;&#xff0c;问最少能将其分成多少段使得满足要求。 【输入格式】第一行包含两个正整数n&#xff0c;m&#xff0c;表示…...

Linux进程——system函数、popen函数

system函数&#xff08;执行shell 命令&#xff09; 头文件 #include <stdlib.h> 函数定义 int system(const char * string); 函数说明 system()会调用fork()产生子进程&#xff0c;由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令&#xff0c;…...

【智能家居】5、主流程设计以及外设框架编写与测试

目录 一、主流程设计 1、工厂模式结构体定义 &#xff08;1&#xff09;指令工厂 inputCmd.h &#xff08;2&#xff09;外设工厂 controlDevices.h 二、外设框架编写 1、创建外设工厂对象bathroomLight 2、编写相关函数框架 3、将浴室灯相关操作插入外设工厂链表等待被调…...

详解ssh远程登录服务

华子目录 简介概念功能 分类文字接口图形接口 文字接口ssh连接服务器浅浅介绍一下加密技术凯撒加密加密分类对称加密非对称加密非对称加密方法&#xff08;也叫公钥加密&#xff09; ssh两大类认证方式&#xff1a;连接加密技术简介密钥解析 ssh工作过程版本协商阶段密钥和算法…...

LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

接着前两节的Langchain&#xff0c;继续实现Langchain中的Agent LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 代码实现 # 从langchain库中导入模块 from langchain.llms import OpenAI # 从langchain.l…...

wpf devexpress绑定grid到总计和分组统计

此主题描述了如何在gridcontrol中的视图模型和显示定义总计和分组统计 在视图模型中指定统计 1、创建 SummaryItemType 枚举你想要在GridControl中显示的统计类型&#xff1a; public enum SummaryItemType { Max, Count, None } 2、创建一个grid统计描述类 public class S…...

嵌入式 Linux 移植与系统启动方法

1、Linux系统启动与U-Boot 所谓移植就是把程序代码从一种运行环境转移到另一种运行环境。对于内核移植来说&#xff0c;主要是从一种硬件平台转移到另一种硬件平台上运行。 体系结构级别的移植是指在不同体系结构平台上Linux内核的移植&#xff0c;例如&#xff0c;在ARM、MI…...

代码随想录算法训练营|五十六天

回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; dp含义&#xff1a;表示区间内[i,j]是否有回文子串&#xff0c;有true&#xff0c;没有false。 递推公式&#xff1a;当s[i]和s[j]不相等&#xff0c;false&#xff1b;相等时&#xff0c;情况一&#xff0c;…...

基于django水果蔬菜生鲜销售系统

基于django水果蔬菜生鲜销售系统 摘要 基于Django的水果蔬菜生鲜销售系统是一种利用Django框架开发的电子商务平台&#xff0c;旨在提供高效、便捷的购物体验&#xff0c;同时支持水果蔬菜生鲜产品的在线销售。该系统整合了用户管理、产品管理、购物车、订单管理等核心功能&…...

【数据结构】快速排序算法你会写几种?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…...

C#访问修饰符

C#中的访问修饰符用于控制类型成员&#xff08;如字段、属性、方法等&#xff09;的访问级别。以下是C#中常用的访问修饰符&#xff1a; public&#xff1a;公共访问级别&#xff0c;没有任何访问限制。在任何其他类或程序集中都可以访问标记为 public 的成员。 private&#…...

anaconda中安装pytorch和TensorFlow环境并在不同环境中安装kernel

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

记一次解决Pyqt6/Pyside6添加QTreeView或QTreeWidget导致窗口卡死(未响应)的新路历程,打死我都想不到是这个原因

文章目录 💢 问题 💢🏡 环境 🏡📄 代码💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 我在窗口中添加了一个 QTreeWidget控件 ,但是程序在运行期间,只要鼠标进入到 QTreeWidget控件 内进行操作,时间超过几秒中就会出现窗口 未响应卡死的 状态 🏡 环境 �…...

如何为《以撒的结合:悔改》安装REPENTOGON扩展框架

如何为《以撒的结合&#xff1a;悔改》安装REPENTOGON扩展框架 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON REPENTOGON是一款针对《以撒的结合&#xff1a;悔改》的扩展…...

3大突破!零基础用开源表盘工具创作专业级小米手表表盘

3大突破&#xff01;零基础用开源表盘工具创作专业级小米手表表盘 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 如何突破官方表盘千篇一律的设计限制&#x…...

基于YOLOV8的车辆检测系统:快速上手与实用功能

基于YOLOV8的车辆检测系统 基于深度学习的车辆检测系统有数据集 模型已经训练好 直接用即可 报告 30r 就是售价 包搭配环境 远程运行跑通程序 本项目已经训练好模型&#xff0c;配置好环境可直接使用&#xff0c;运行效果见图像&#xff08;可找我要演示视频&#xff09; 项…...

低显存福音:实测Neeshck轻量化工具,16G显卡流畅跑Z-Image模型

低显存福音&#xff1a;实测Neeshck轻量化工具&#xff0c;16G显卡流畅跑Z-Image模型 1. 轻量化方案的诞生背景 1.1 大模型与小显存的矛盾 Z-Image作为国产文生图模型的代表&#xff0c;其强大的生成能力有目共睹。但原生部署对显存的高要求&#xff08;通常需要20GB以上&am…...

OpenCascade实战:TopoDS_Shape数据结构的高效遍历与优化策略

1. TopoDS_Shape数据结构基础解析 在OpenCascade中&#xff0c;TopoDS_Shape是构建三维模型的基石。这个看似简单的类实际上包含了三个关键数据成员&#xff1a;myTShape、myLocation和myOrient。理解这三个字段的运作机制&#xff0c;是高效操作模型的前提。 myTShape是一个智…...

Windows 11 + RTX4060Ti 实战:用PyTorch复现Kaggle冠军的U-Net,搞定Kvasir息肉分割

Windows 11 RTX4060Ti 实战&#xff1a;用PyTorch复现Kaggle冠军的U-Net&#xff0c;搞定Kvasir息肉分割 在消费级硬件上实现专业级医学图像分割并非遥不可及。当RTX 40系列显卡遇上PyTorch框架&#xff0c;配合Kaggle冠军团队的U-Net架构&#xff0c;我们完全可以在Windows 1…...

替代CM108|替代CM108B|替代HS100|SSS1629代理商|中文说明书|台湾鑫创

SSS1623,SSS1629全面兼容与替代台湾骅讯c-mediaCM108/CM108B/CM108AH/CM118B/CM119/CM119A/HS100/CM6120/CM6317A/CM6400/CM6200等型号, 全面兼容与替代台湾创舰Isoft IS817/IS821/IS828/IS820/IS807等型号,完美替代市面上所有主流USB耳机IC,USB喇叭IC, USB音箱IC, USB游戏耳机…...

不只是CTF:用Kali+Pwntools+GDB-Peda搭建你的第一个漏洞分析实验台

从CTF到实战&#xff1a;构建专业级二进制漏洞分析实验环境 在安全研究领域&#xff0c;CTF比赛中的Pwn挑战只是冰山一角。真正的价值在于将这些技能应用于现实世界的漏洞分析和利用。本文将带你搭建一个专业级的本地漏洞分析实验环境&#xff0c;这个环境不仅能应对CTF题目&a…...

ComfyUI-WanVideoWrapper:5个技巧快速上手14B参数AI视频生成插件

ComfyUI-WanVideoWrapper&#xff1a;5个技巧快速上手14B参数AI视频生成插件 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在AI视频生成领域&#xff0c;ComfyUI-WanVideoWrapper作为一款强大…...

编译原理不再难:借助快马AI生成交互式示例,轻松入门语法分析

编译原理不再难&#xff1a;借助快马AI生成交互式示例&#xff0c;轻松入门语法分析 刚开始学习编译原理时&#xff0c;最让我头疼的就是语法分析这部分。那些抽象的文法规则、递归下降、LL(1)分析等概念&#xff0c;光看理论总觉得云里雾里。直到我尝试用InsCode(快马)平台做…...