用幻灯片讲解C++手动内存管理

用幻灯片讲解C++手动内存管理

1.栈内存的基本元素

在这里插入图片描述

2.栈内存的聚合对象

在这里插入图片描述

3.手动分配内存和释放内存

注意:手动分配内存,指的是在堆内存中。
除非实现自己的数据结构,否则永远不要手动分配内存!
即使这样,您也应该通过std::allocator_traits使用分配器。(注:allocator_traits是STL库的对自定义内存分配器的统一接口)
在这里插入图片描述

4.在堆上手动分配内存

p被当做拥有一个原始指针。这幅幻灯片有个bug,不知各位看出来没有?
在这里插入图片描述

5.手动分配数组内存和释放数组内存

注意:释放数组内存delete后一定要带[ ],否则程序将产生不可预知的后果,大概率是报内存错误后程序挂掉,因为你只释放了数组的一个元素的内存,其它内存没有释放,造成了内存泄漏。
作者再次强调了:
除非实现自己的数据结构,否则永远不要手动分配内存!
即使这样,您也应该通过std::allocator_traits使用分配器。
在这里插入图片描述

6.手动分配数组内存

在这里插入图片描述

7.不要使用拥有的原始指针

  • 指针指向已经删除的内存怎么办?
  • 如果指针指向其他进程保留的内存怎么办?
  • 我们必须手动跟踪分配(new)和解除分配(delete)
  • 非常容易出错,可能导致难以捕捉的bug

下图就是一个经典的错误,释放内存后,用户忘记了已经释放,然后又向p指向的内存写入值,产生内存错误,程序挂掉!
在这里插入图片描述

8.黑暗时代和现代C++时代

黑暗时代(C++11之前)

  • 拥有原始指针
  • 经常在不同的代码点显式的new和显示的delete
  • 非直观界面
  • 内存易泄漏

现代C++时代

智能指针
  • 自动删除对象
  • 自我文档化接口/所有权(指由智能指针来管理内存,不需要用户关系具体细节)
  • 没有内存泄漏
    在这里插入图片描述

9.地址检测器(ASAN)

  • 支持的编译器:g++、clang++
  • 检测内存错误
    • 内存泄漏
    • 访问已经释放的内存
    • 访问不正确的堆栈区域
  • 使用附加说明检测您的代码
    • 运行时间增加约70%
    • 内存使用量增加了大约3倍

注:ASAN是谷歌开发的一个动态内存检测器,可以检测出各种内存相关的错误。
在这里插入图片描述

10.示例:检测空指针

在这里插入图片描述

11.使用ASAN

在这里插入图片描述

12.Valgrind工具

(Valgrind 是一个强大的内存调试和性能分析工具集,广泛应用于 C/C++ 等编程语言的软件开发和分析中。)

检测常见运行时错误。

  • 读/写释放的内存或不正确的堆栈区域。
  • 使用未初始化的值。
  • 不正确的内存释放,如双重释放。
  • 滥用内存分配函数。
  • 内存泄漏-无意内存泄漏通常与程序逻辑缺陷有关,这些缺陷导致内存指针在重新分配之前丢失。

Windows:

Dr.Memory (www.drmemory.org) (Windows平台上的C/C++内存错误检查器)
Windows 10 64位:在WSL中的Valgrind
在这里插入图片描述

13.Valgrind使用

在这里插入图片描述
在这里插入图片描述

14.标准库中的异常

operator new 会抛出以下异常:

  • std::bad_alloc 如果内存没有被成功分配
  • std::bad_new_array_size 如果数组长度小于0或者太大
    在这里插入图片描述

15.异常安全性的含义

内存泄漏的潜在来源
如下图的示例,如果文件不存在抛出异常后则就会造成buf指向的内存没有被释放,内存泄漏!
在这里插入图片描述

16.智能指针工程及其异常安全性

  • C++标准要求:
    • 所有函数参数必须在进入函数前求值。
    • 未指定函数参数求值顺序。
  • 6种参数求值顺序的两种。
    在这里插入图片描述

下图可能会造成内存泄漏

可能的求值顺序:

  1. new Widget{}
  2. Gadget{}
  3. unique_ptr{}

如果Gadget构造函数抛出异常

  • Widget对象已经构建(在堆上)
  • unique_ptr尚未获取Widget对象的所有权
  • Widget对象泄漏
    在这里插入图片描述
    下图代码就不可能有内存泄露:
  • 调用make_unique()在Gadjet构造函数调用之前或之后完全计算。
  • 如果Gadget构造函数抛出异常:
    • 则Widget已经被unique_ptr所拥有,
    • 无论如何,Widget都会被正确地销毁。
  • 使用 make_unique和make_shared来创建智能指针!
    在这里插入图片描述
    希望文章对您有所帮助,整理不易,请随手点个赞!原文链接:hackingcpp.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nerstudio 相机优化代码理解

源码 有两种模式,SO3xR3和SE3,代表不同的刚体变换,都是6个参数,表述三个旋转角3个偏移量 # Initialize learnable parameters.if self.config.mode "off":passelif self.config.mode in ("SO3xR3", "S…

ABC353

A #include<bits/stdc.h>using namespace std;int n;int main() {cin>>n;int m0;int i0;int pos0;while(m<n){mpow(2,i);i;pos;}cout<<pos; }B 模拟 #include <iostream> #include <cstring> #include <algorithm>using namespace s…

进入新公司有焦虑感怎么办?

前因 前两天技术交流群里有童鞋问了一个很有意思的问题&#xff0c;他问如何克服进入新公司的焦虑感&#xff1f;很多热心的童鞋都纷纷支招&#xff0c;比如 “主动干活”、“专注干活”、“让时间冲淡焦虑感”、……等等&#xff0c;这些都很有道理&#xff0c;不过&#xff…

今时今日蜘蛛池还有用吗?

最近不知道哪里又开始刮起“蜘蛛池”这个风气了&#xff0c;售卖、购买蜘蛛池的行为又开始在新手站长圈里开始蔓延和流行了起来&#xff0c;乍一看到“蜘蛛池”这个词给明月的感受就是陌生&#xff0c;要经过回忆才能想起来一些残存的记忆&#xff0c;所谓的蜘蛛池说白了就是利…

PHP编程入门:揭开Web开发的神秘面纱

PHP编程入门&#xff1a;揭开Web开发的神秘面纱 在数字化时代&#xff0c;PHP作为一种广泛使用的服务器端脚本语言&#xff0c;为Web开发领域注入了强大的活力。无论你是编程新手还是有一定经验的开发者&#xff0c;掌握PHP编程都将为你开启一扇通往Web开发新世界的大门。接下…

grpc接口调用

grpc接口调用 准备依赖包clientserver 参考博客&#xff1a; Grpc项目集成到java方式调用实践 gRpc入门和springboot整合 java 中使用grpc java调用grpc服务 准备 因为需要生成代码&#xff0c;所以必备插件 安装后重启 依赖包 <?xml version"1.0" encoding&…

mysql buffer pool 详解

概念&#xff1a;为了缓存磁盘中的页&#xff0c;mysql服务器启动时会向操作系统申请一片连续的内存空间&#xff0c;这片连续的内存空间叫做buffer pool&#xff0c;即缓冲池。 buffer pool 默认大小&#xff1a;128M innodb_buffer_pool_size&#xff1a;自定义缓冲池大小 …

ECS搭建redis4.0集群版

在 CentOS 上安装 Redis 4.0 集群版涉及多个步骤&#xff0c;包括安装 Redis、配置集群并启动它。下面将详细介绍整个过程&#xff1a; 1. 系统更新 首先&#xff0c;保证系统是最新的。 sudo yum update2. 安装依赖项 安装构建 Redis 所必需的依赖&#xff1a; sudo yum …

计算机三级等级考试

计算机等级考试&#xff1a; 一&#xff1a;理论知识考试 100分考60分 1&#xff1a;题库 二&#xff1a;技能考试 100分考60分 1&#xff1a;写文档 项目概述 功能描述 数据库设计 UML 绘 图 用例图 与 包图&#xff08;两个图&#xff09; 2&…

使用 nmcli 命令设置 IP 地址并排查网络故障

在现代网络管理中&#xff0c;nmcli&#xff08;NetworkManager Command Line Interface&#xff09;是一个非常强大和实用的工具。它不仅可以帮助你设置 IP 地址&#xff0c;还能协助排查各种网络故障。今天&#xff0c;我们将深入探讨如何使用 nmcli 命令来高效地管理你的网络…

node mysql的增删改查基础

学习koa时&#xff0c;不选择mongodb&#xff0c;而是MySQL&#xff0c;虽然node对mongodb更亲和&#xff0c;但是我感觉MySQL的键值对的储存结构更正规 1.首选确认你的数据库有个库。有个表,我的如下 2.配置 let mySqlConfig{host:localhost,user:root,password:123456,data…

C#操作MySQL从入门到精通(10)——对查询数据进行通配符过滤

前言 我们有时候需要查询数据,并且这个数据包含某个字符串,这时候我们再使用where就无法实现了,所以mysql中提供了一种模糊查询机制,通过Like关键字来实现,下面进行详细介绍: 本次查询的表中数据如下: 1、使用(%)通配符 %通配符的作用是,表示任意字符出现任意次数…

rose 聊开源—1 你为什么需要一个开源项目

我自己从最开始开源 rosedb/lotusdb&#xff0c;以及一些其他组件&#xff0c;折腾开源也有很多年了&#xff0c;这次想写一个关于开源项目的系列&#xff0c;结合我自己的实际经历&#xff0c;讲讲开源项目的开发、参与、维护、流程规范、收获、盈利等内容&#xff0c;希望这个…

2024.6.5

1、react原理学习&#xff0c; hook、fiber 2、瀑布流组件完善 3、代码随想录二刷

如何充分利用代理IP扩大网络接触面

目录 前言 第一部分&#xff1a;什么是代理IP&#xff1f; 第二部分&#xff1a;如何获取代理IP&#xff1f; 1. IP质量 2. 匿名性 3. 限制 第三部分&#xff1a;如何使用代理IP&#xff1f; 第四部分&#xff1a;如何充分利用代理IP&#xff1f; 总结&#xff1a; 前…

【java前端课堂】04_类的继承

类的继承 在Java中&#xff0c;继承是面向对象编程的四大基本特性之一&#xff0c;它允许我们根据一个已有的类来定义一个新的类&#xff0c;这个新的类继承了原有类的特性&#xff08;属性和方法&#xff09;&#xff0c;并可以添加新的特性或修改原有特性。这样&#xff0c;…

Web前端框架:深入探索与实践

Web前端框架&#xff1a;深入探索与实践 在当下数字化飞速发展的时代&#xff0c;Web前端框架的选择与应用成为了开发者们关注的焦点。Node.js&#xff0c;作为一种强大的后端技术&#xff0c;在前端框架的构建中也发挥着不可或缺的作用。本文将围绕Node.js Web前端框架&#…

KNN 算法【python,机器学习,算法】

KNN&#xff08;K-Nearest Neighbors&#xff09;算法是一种基本的、易于理解的机器学习算法&#xff0c;用于分类和回归问题。在 KNN 中&#xff0c;一个对象的分类或值是基于其k个最近邻居的多数投票或平均值来决定的。 基本原理 距离度量&#xff1a;首先&#xff0c;KNN …

SRE养成计划之02-基本命令(持续更新)

基本命令&#xff08;续&#xff09; 软连接 软连接 --> 原始文档 --> 文档数据格式&#xff1a;ln -s 原始文件或目录 软连接文件若原始文件或目录被删除&#xff0c;链接文件将失效软连接可存放在不同分分区/文件系统 硬链接 硬链接 --> 文档数据格式&#xff1…

【Python数据预处理系列】Pandas 数据操作实战:掌握 .loc[] 方法进行高效数据选取

文章将详细介绍.loc[]方法的各种使用场景&#xff0c;帮助读者深入理解并掌握这一核心功能。 在Pandas库中&#xff0c;.loc[]方法是一种强大而灵活的数据选取工具。本文将通过详细的步骤和示例&#xff0c;手把手教您如何利用这一工具进行高效的数据操作。 首先&#xff0c;我…