C++动态内存管理——智能指针

2023-11-02

智能指针

1.什么是智能指针?

智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露(利用自动调用类的析构函数来释放内存)。

实现技术是使用引用计数(shared_ptr)、资源独占(unique_ptr和auto_ptr)、只引用,不计数(weak_ptr)

指针和智能指针:

智能指针是对象,对象在过期时,会调用其析构函数析构掉,而常规指针,当其指向堆内存,最终需要人为的delete

2.为什么需要智能指针?

(1)new和delete管理动态内存存在的三个常见问题:

1)忘记delete内存

2)使用已经释放掉的对象

3)同一块内存释放两次

(2)中途抛出异常,无法释放资源。

3.智能指针的原理

创建一份资源出来的时候,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。除此之外,通过运算符重载(重载*和重在-> 等),可以像指针一样使用。

4.3种智能指针的实现策略/实现技术

(1)auto_ptr和unique_ptr:

采用的是单独所有权的概念,对于特定对象,只能被一个智能指针所拥有,这样,只有拥有该对象的智能指针的析构函数才会删除该对象,但要注意的是,赋值操作会转让操作权。 

(2)shared_ptr

shared_ptr则采用引用计数的策略,共享所有权,即可以让多个指针指向同一

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++动态内存管理——智能指针 的相关文章

  • java监听窗口关闭事件_JavaFX 监听窗口关闭事件实例详解

    1 写在前面 在JavaFX的程序开发的时候 在使用多线程的时候 默认情况下在程序退出的时候 新开的线程依然在后台运行 在这种情况下 可以监听窗口关闭事件 在里面关闭子线程 2 具体实现的样例 package sample import j
  • 教程:将数据从Excel导出到C#中的数据表

    MS Excel电子表格被广泛用于保留小型 中型或大型数据 在各种情况下 电子表格都充当存储应用程序数据的数据库 在这种情况下 可能需要从Web或桌面应用程序中读取存储在Excel文件中的数据 对于这种情况 本文介绍如何将数据从Excel工
  • Ext4文件系统介绍 - 理论篇

    Overview ext4文件系统分割成多个block groups 为了解决碎片化问题 block allocator尽量将一个文件的block放在一个group中 block groups的size通过sb s blocks per g
  • Vue父子组件通信之子组件主动获取父组件的数据和方法(三)

    子组件主动获取父组件的数据和方法 实现方式 this parent 属性 this parent 方法 代码示例 父组件
  • 简单教会你如何使用视频ID获取视频详情

    前往注册开通测试 onebound douyin item get video 公共参数 名称 类型 必须 描述 key String 是 调用key 必须以GET方式拼接在URL中 secret String 是 调用密钥 api nam
  • 基于Yolov5的交通标志检测识别设计

    项目介绍 上一篇文章介绍了基于卷积神经网络的交通标志分类识别Python交通标志识别基于卷积神经网络的保姆级教程 Tensorflow 并且最后实现了一个pyqt5的GUI界面 并且还制作了一个简单的Falsk前端网页实现了前后端的一个简单
  • 《网页设计基础——HTML常用标签》

    网页设计基础 HTML常用标签 一 HTML网页框架 格式 二 块级标签 1 标题标签 h1 一级标题 h1 h2 二级标题 h2 h3 三级标题 h3 h4 四级标题 h5 五级标题 h6 六级标题 h6 h5 h4
  • java random.nextint_java Random.nextInt()方法的具体使用

    lic int nextInt int n 该方法的作用是生成一个随机的int值 该值介于 0 n 的区间 也就是0到n之间的随机int值 包含0而不包含n 直接上代码 package org xiaowu random demo impo
  • Android SDK AndroidStudio 国内可用的镜像/代理地址

    http www androiddevtools cn 一站式下载地址 齐全 Android SDK在线更新镜像服务器 1 中国科学院开源协会镜像站地址 IPV4 IPV6 mirrors opencas cn 端口 80 IPV4 IPV
  • Linux QQ 一个命令搞定它

    一个命令就能在linux上用QQ了 在debian下 apt get install gaim 基本上全部聊天软件都能用了 QQ MSN ICQ yahoo通 等等 你如果是用其它linux的话 那就麻烦得多了 要到以下地址找gaim和它的
  • C 标准库 - 《signal.h》

    原文链接 https www runoob com cprogramming c standard library signal h html 简介 signal h 头文件定义了一个变量类型 sig atomic t 两个函数调用和一些宏
  • 数据结构练习题-3栈和队列

    选择题 1 若让元素1 2 3 4 5依次进栈 则出栈次序不可能出现在 种情况 A 5 4 3 2 1 B 2 1 5 4 3 C 4 3 1 2 5 D 2 3 5 4 1 答案 C 解释 栈是后进先出的线性表 不难发现C选项中元素1比元
  • JS删除两个数组对象中id相同的对象

    let arr1 id 1 name json id 2 name book let arr2 id 1 name json age 15 id 2 name book age 16 id 3 name ani age 17 ES6的方法
  • xshell通过跳板机使用隧道和代理连接服务器

    1 建立和跳板机的连接 主机和端口为跳板机的ip和端口 2 使用publicKey认证 3 通过隧道建立和目标主机的连接 源主机为localhost 侦听端口任意填不和本地端口冲突即可 目标主机和端口为要访问的主机端口 4 使用代理 加快本
  • [完美解决]当前不会命中断点。还没有为该文档加载任何符号。

    原文地址 http www cnblogs com furenjun archive 2011 05 31 2064287 html 概述 在调试SL项目 我重装了电脑 项目也是重新配置的 后来在调试的时候发现断点进不去 折腾了两个小时 将
  • vue自定义指令v-loading

    elementUI或者antdesign上的loading拿来就用简单无脑 以前我也是一直在用UI框架自带的loading 后来用的发现好呆板 一点也不炫酷 于是就自定义了 废话不说了直接看效果图 1 创建文件 1 在 src目录下创建一个
  • 学习笔记:区块链概念入门

    本文是100天区块链学习计划的第二篇学习笔记 其实就是按照阮一峰的网络日志 区块链入门教程的讲解进行的简单梳理 也是时间有点紧张的原因 相比于上一篇SHA256算法原理详解 个人感觉质量和原创程度明显下降 待对区块链有了更深的理解后 我会回
  • 【cuda大师班】p12 主机和设备之间的数据传递

    一 主机和设备之间的数据传递 1 1 基本流程框图 1 2 数据传递函数 在主机和设备之间必须显式的传递数据 1 3 代码 使用h 表示某个变量是主机变量 使用d 表示某个变量是主机变量 include cuda runtime h inc

随机推荐

  • ugui实现listview效果

    我们今天要实现listview的效果 首先看下ui结构 根节点是画布 Store节点只是为了固定锚点 抛开背景和标题 核心部分只有ScrollRect ViewPoint Slots Scrollbar ScrollRect是滑动布局 co
  • C++ Programming/RTTI

    原文地址 http en wikibooks org wiki C 2B 2B Programming RTTI Run Time Type Information RTTI RTTI refers to the ability of th
  • Flutter原理与美团的实践

    Flutter是Google开发的一套全新的跨平台 开源UI框架 支持iOS Android系统开发 并且是未来新操作系统Fuchsia的默认开发套件 自从2017年5月发布第一个版本以来 目前Flutter已经发布了近60个版本 并且在2
  • Python- 关于重复字段的一些统计

    问题场景 1 统计dataframe中某两个 多个 字段作为一个整体在dataframe中重复的次数 gt 得到 gt 2 获取某一字段重复次数最多的索引 PS 上图中count最大值为3 索引index 为0 3 获取某一字段重复次数最多
  • Java软件开发

    在开发中我们使用比较多的集合就是List Set和Map了 并且我们也知道大部分用的基本上都是ArrayList LinkedList HashMap HashSet或者TreeSet这几个集合 但是我们在学习使用它们的时候都知道它们这几个
  • upload-labs:pass-07

    is upload false msg null if isset POST submit if file exists UPLOAD PATH deny ext array php php5 php4 php3 php2 html htm
  • 实验九、内核虚拟化

    1 搭建openEuler x86 64系统的qemu虚拟机 1 1 安装虚拟化组件 dnf install y libvirt qemu 1 2验证是否安装成功 安装成功 1 3查看libvird是否已启动 启动成功 1 4查看虚拟网络配
  • QT笔记——QTableWidget点击表头排序问题 数据消失

    在QTableWidget 点击表头排序后 发现重新加载进来的数据消失或者很多空白 解决方法 排序方法 void DesignProductWidget DesignProductWidget ui tableWidget gt setSo
  • mysql安装—基于deepin

    文章目录 MySQL安装 基于deepin20 2 一 安装包准备 二 安装mysql 三 安装完成 MySQL安装 基于deepin20 2 今天带来一期关于如何在Deepin上安装MySQL 总体来说是比较简单的 一 安装包准备 火狐浏
  • opencv中更改摄像头参数,更改mpjg和帧率遇到的问题

    import numpy as np import cv2 import time cv2 VideoCapture set cv2 CAP PROP FPS 30 cap cv2 VideoCapture 0 cap cv2 VideoC
  • Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    目录 一 Centos7 配置说明 1 1 Firewalld 防火墙 1 2 SELinux 二 安装准备工作 2 1 安装环境 2 2 部署环境说明 2 3 配置主机名 master和node节点都执行 2 3 1 修改主机名 2 3
  • redis master和slave怎么实现数据同步

    转载于 https blog csdn net hxpjava1 article details 78347890 Redis的主从同步机制可以确保redis的master和slave之间的数据同步 按照同步内容的多少可以分为全同步和部分同
  • yolov5小目标检测-提高检测小目标的检测精度

    目前基于目标检测方面 近些年基于深度学习的人神经网络产生了很多经典且高效的网络结构 其中不乏有凯明大神的Fast RCNN Faster RCNN家族系列检测网络结构 还有号称you only look once的YOLO系列 本次分享的就
  • 服务器的可维护性,可靠性和可维护性

    可靠性和可维护性 可靠性一直是戴尔服务器产品线的一大亮点 R515也不例外 如内部结构所示 当你打开R515机箱的时候 你可以很明显地看到风扇的数量 分布的各个组件和双电源机箱 你也可以感觉出从中取出各个组件和拆装机箱都十分简便 配合低能耗
  • Flask——使用表单并检验参数

    回顾上期的程序代码 from flask import Flask render template from flask wtf import FlaskForm from wtforms import StringField Passwo
  • 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程

    图的邻接矩阵表示 通常图的表示有两种方法 邻接矩阵 邻接表 本文用邻接矩阵实现 一是代码量更少 二是代码风格也更贴近C语言 但不论是图的哪种实现方式 其基本的实现思想是不变的 1 节点的信息 我们用一维数组a n 来存储 假设图共有n个节点
  • QQ小程序广告代码

    qml内代码
  • elasticsearch查看分词结果

    第一种情况 查看任意一段文本 能分成哪些词汇 http localhost 9200 analyze POST 第二种情况 查看已经入库的数据 分词情况 http localhost 9200 index type id termvecto
  • keil中出现Undefined symbol 等问题解决办法

    在keil中仿照别人的程序写了RCC初始化的程序 编译后出现以下问题 obj pro1 axf Error L6218E Undefined symbol FLASH PrefetchBufferCmd referred from main
  • C++动态内存管理——智能指针

    智能指针 1 什么是智能指针 智能指针 smart pointer 是存储指向动态分配 堆 对象指针的类 用于生存期控制 能够确保自动正确的销毁动态分配的对象 防止内存泄露 利用自动调用类的析构函数来释放内存 实现技术是使用引用计数 sha