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

2024-06-06 01:52

本文主要是介绍用幻灯片讲解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

这篇关于用幻灯片讲解C++手动内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034770

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)