C/C++内存管理(内存分布、动态内存分配、动态内存分配与释放、内存泄漏等)

喵~

  • 内存之5大区(栈区、堆区、静态区、常量区、代码区)
  • C/C++中各自的内存分配操作符
  • 内存泄露?
  • 内存泄漏检测方法

内存之5大区(栈区、堆区、静态区、常量区、代码区)

在这里插入图片描述
1、栈区(stack):由编译器自动分配、释放,存放函数的参数值,局部变量值等。
在这里插入图片描述

2、堆区(heap):一般由程序员分配、释放,随叫随到,挥之即走,这块内存也就是我们说的动态内存

下面程序中简单呈现了动态内存的分配与释放

通过new关键在堆区动态分配内存,通过delete释放动态内存

在高并发场景中,申请的内存必须要释放,否则会造成内存释放

整个分配的动态内存周期就是从new申请到delete结束
在这里插入图片描述

3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。

全局变量和静态变量都存放在全局区或者静态区

但是静态变量的使用范围只在声明它的函数内

在这里插入图片描述

4、常量区:存放常量字符串。

在这里插入图片描述

5、程序代码区:存放函数体(包括 函数)的二进制代码

所有需要执行的指令都在代码区

C/C++中各自的内存分配操作符

动态分配的内存都在堆上

1、C++中内存分配所使用的操作符为 new 和 delete
2、C 中内存分配所使用的操作符为 malloc 和 free

void *malloc(size_t size); //参数为所需内存的字节数
void free(void *);
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域 的首地址

free释放内存的时候需要传入要释放的地址作为参数

delete释放内存的时候不需要参数, 直接后面跟上即可

在这里插入图片描述

总结:

1、在软件项目开发过程中,我们经常需要动态地分配和撤销内存空间,特别是数据结构中结点的插入与删除。在C 语言中是利用库函数malloc 和free 来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new 和delete 来取代malloc 和free 函数。
注意: new 和delete 是运算符,不是函数,因此执行效率高。

2、虽然为了与C 语言兼容,C++仍保留mallocfree 函数,但建议用户不用mallocfree 函数,而用newdelete 运算符

new 运算符的例子:

new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)

new int(10); //开辟一个存放整数的空间,并指定该整数的初值为10,返回一个指向该存储空间的地址

new char[100]; //开辟一个存放字符数组(包括100 个元素)的空间,返回首元素的地址

new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址

float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p

3、newdelete 运算符使用的一般格式为:

使用方法:
指针变量= new 类型(常量);//变量及为其赋值
指针变量= new 类型[表达式]; //数组
指针变量= new 类型[表达式][表达式] ;//二维数组

作用: 从堆上分配一块“类型”指定大小的存储空间,返回首地址
其中:
“常量”是初始化值,可缺省
创建数组对象时,不能为对象指定初始值

delete 运算符释放已分配的内存空间:
使用方式:
普通类型(非数组)使用: delete 指针变量
数组使用: delete[] 指针变量
其中“指针变量” 必须是一个new 返回的指针!

4、基础数据类型可以使用new与freemalloc和delete混搭

假设分配内存并进行初始化:
int * p2 = new int(1000);

delete p2;同于free(pa);

内存泄露?

内存泄漏(Memory Leak) , 是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏检测方法

内存泄漏工具:
Windows : Purify,BoundsCheaker、Deleaker、VisualLeak Detector(VLD)
Linux 平台:Valgrind memcheck

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

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

相关文章

与彭老师交流(北京大学 心理与认知科学学院)

交流:主要是了解人家在做什么对什么感兴趣,和让人家知道你在做什么对什么感兴趣,然后你觉得未来可以做什么有价值的事情。 1.老师做的方向里面有包含利用人工智能这一块的知识,我觉得我是可以做的,机理这一块的东西我不…

三、Docker命令及基本使用

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、帮助启动类命令1.1 启动docker1.2 停止docker1.3 重启docker1.4 查看docker状态1.5 开机启动1.6 查看docker概要信息1.7 查看docker总体帮助文档1.8 查看docker命令…

LLM - ChatGLM-6B (General Language Model) 的工程配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper:GLM: General Language Model Pretraining with Autoregressive Blank Infilling ChatGLM是通用的预训练语…

网络基础一

网络发展 独立模式:计算机之间相互独立。 网络互联:多台计算机连接在一起,完成数据共享。 局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起; 广域网WAN:将远隔千里的计算机都连在…

机器学习15:神经网络-Neural Networks

神经网络是特征交叉的更复杂版本。本质上,神经网络会学习适当的特征组合。本文主要介绍神经网络的结构、隐藏层、激活函数等内容。 目录 1.神经网络:结构 2.隐藏层 3.激活函数 3.1 常用激活函数 3.2 小结 4.神经网络小练习 4.1 第一个神经网络 …

【spring源码系列-05】refresh中prepareRefresh方法的执行流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

【嘉立创EDA】层次原理图功能使用,或放置复用图块方法

文章路标👉 文章解决问题主题内容小结文章解决问题 1️⃣ 在一些较为复杂的原理图绘制时,常需要使用到复用图块。何为复用图块,笔者摘取ST MB1136设计原理图纸可以较好表述这个功能,如下图所示: [本图摘取自NUCLEO-F103RB设计图纸 sheet 2 of 5] 图中左上角绿色图块为…

AI 绘画 - 建筑绘图辅助设计之 Controlnet SEG Depth

前情提要 2023-06-17 周六 杭州 雨转阴 小记: 周末的午休感觉还是没有尽兴,说是要乖乖休息却只是躺下闭目养神。 任务清单: a. Sketchup 安装和学习; b. Sketchup 建模学习; c. Controlnet SEG 语义分割基础; d. Controlnet Depth; 简介 应用实践 …

git 的基本操作

1. git建立本地仓库 在想要建立的目录下输入命令 git init 我们可以看一下 .git目录下有什么 2. 配置git本地仓库 配置用户的 name 和 email 命令:git config [...] 配置完后,我们像查看一下 刚才的配置 2.1 查看配置命令 git config -l 2.2 删除…

PyTorch的ONNX结合MNIST手写数字数据集的应用(.pth和.onnx的转换与onnx运行时)

在PyTorch以前的模型都是.pth格式,后面Meta跟微软一起做了一个.onnx的通用格式。这里对这两种格式文件,分别做一个介绍,依然使用MNIST数据集来做示例 1、CUDA下的pth文件 那pth文件里面是什么结构呢?其实在以前的文章就有介绍过…

HTML 超链接标签、图片标签

超链接标签 超链接描述 HTML使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分。 <a href"url">链接文…

图片加载失败捕获上报及处理

图片加载失败捕获上报及处理 前端页面中加载最多的静态资源之一就是图片了&#xff0c;当出现图片加载失败时&#xff0c;非常影响用户体验。这时候我们就需要对图片是否成功加载进行判断&#xff0c;并对图片加载失败进行处理。 图片加载监听 单个捕获 HTML中的img标签可以…