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

news2024/11/19 0:39:49

喵~

  • 内存之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.coloradmin.cn/o/706716.html

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

相关文章

避雷投稿!这3本SCIE期刊处于On Hold状态!有剔除风险!

今年3月份科睿唯安剔除的大量期刊中,有几本期刊之前被WOS数据库标记为“On Hold”状态,后面也出现了一些期刊解除“On Hold”状态的情况。 目前,WOS数据库查询有3本SCIE期刊正处于“On Hold”状态,这是什么信号呢?对于…

org.apache.thrift.transport.TTransportException: GSS initiate failed

hive配置kerberos發現錯誤,就所有的配置都配好了,但是使用datagrip連接hive時報錯如下: org.apache.thrift.transport.TTransportException: GSS initiate failed 後面是沒有認證的原因,使用kinit 認證即可 還有一種情況是 我使…

7.1下周黄金非农数据是否会影响美联储七月暂停加息?

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:周五(6月30日),现货黄金价格收盘上涨,盘中一度升破1920美元关口。美国疲软的个人消费支出推动了美国国债收益率的下降,从而导致美…

libevent实践04:监听管道第二季

一 本次实例使用函数简介 事件集合初始化: struct event_base *event_init(void); 示例: struct event_base *base event_init(); 单个事件初始化 void event_set(struct event *ev, evutil_socket_t fd, short events,void (*callback)(evutil_s…

两小时快速入门 TypeScript 基础(二)面向对象

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js 等) 📃个人状态: 2023届本科毕业生,已拿多个前端 offer&#x…

【实战】 二、React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表1.新建文件2.状态提升3.新建utils4.Custom Hook 学习内容来源:React React Hook TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.0…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十二天 12/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

服务运营|MS 论文解读:MIR 增强的Benders 分解用于具有到达率不确定性的多类服务系统人员调度问题

推文作者:王畅,蔡君洋,Guo 编者按 劳动力调度是服务系统运营的一个重要应用场景,当系统中的服务集和客户集异构且客户到达率不确定时,劳动力调度问题会变得特别复杂。本文因此引入了一个两阶段的随机整数规划模型&…

【静态单元格 Objective-C语言】

一、预习QQ动态 1.我们今天,是三、到四个任务,第一个任务,就是这个,预习QQ动态 OK,看到这个效果了吗 这是咱们第一个任务,第一个任务,是实现这么一个效果, 一看这个,就肯定是个啥,UITableView吧, 是不是肯定是一个TableView啊 又能滚动,又能显示一行一行的数据…

Qt QGraphicsScene、QGraphicsView类实现仪表盘

Qt QGraphicsScene、QGraphicsView类实现仪表盘 【1】UI界面设计【2】效果【3】QGraphicsScene简介【4】QGraphicsEllipseItem简介【5】QGraphicsPolygonItem简介【6】QGraphicsLineItem简介【7】QGraphicsView简介【8】仪表源码头文件源码 【1】UI界面设计 【2】效果 【3】QGr…

OpenStack(T版)——对象存储(Swift)服务介绍与安装

文章目录 OpenStack(T版)——对象存储(Swift)服务介绍与安装安装和配置(controller)准备安装和配置Swift对象存储服务组件创建账户 Ring创建容器 Ring创建对象 RingSwift 存储系统的主配置文件修改文件属主 安装和配置(compute)准备配置Swift对象存储服务组件 验证(1)加载环境变…

《程序员的AI书_从代码开始》第二章 手工实现神经网络

文章目录 2.1 感知器2.1.1 从神经元到感知器2.1.2 实现简单的感知器 2.1 感知器 2.1.1 从神经元到感知器 2.1.2 实现简单的感知器 class Perception(object):def __init__(self,eta0.01,iterations10):self.lr etaself.iterations iterationsself.w 0.0self.bias 0.0sel…

Red Hat宣布限制访问源代码,尚有两种方式可获取

日前Red Hat宣布限制访问Red Hat Enterprise Linux(RHEL)源代码,而此举也将影响AlmaLinux 、Rocky Linux 等下游发行版。 随即Rocky Linux发布了名为《Keeping Open Source Open》的博文。文中是这样说的:    Red Hat的**ERP**服务条款 (TOS) 和最终…

dotnet-dump/trace

一、dotnet-dump dotnet tool install -g dotnet-dump ps -ef | grep dotnet export PATH$PATH:$HOME/.dotnet/tools dotnet-dump collect --process-id 31555 #等待最后出输出:Writing full to /root/core_20230701_095230 #分析/root/core_20230701_095230文件 d…

【doxygen】支持 markdown 目录

文章目录 创建章节和子章节配置 doxygen Doxygen 不直接支持 Markdown 的 [toc] 语法。但是,你可以通过以下步骤手动创建目录: 创建章节和子章节 在 Markdown 文件中,使用标题标记( # )来创建章节和子章节。 Note:…

D2L运行环境问题+anaconda 多环境

环境问题 背景: 换了电脑,当前的电脑原先就装着Python3.9.0 直接pip install d2l & torch can work but when i start the jupyter, it use the anaconda SDK which is 3.6.4 so i need to install the d2l& torch under anaconda python sdk b…

第二章:Fast R-CNN网络详解

(目标检测篇)系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读…

10个最好的免费PDF阅读器清单分享

PDF(便携式文档格式)已成为数字文档分发和共享的事实上的标准。要高效地查看、注释和编辑 PDF 文件,可靠的 PDF 阅读器至关重要。在这篇综合文章中,我们将探讨当今可用的前 10 款 PDF 阅读器,评估它们的功能、可用性和…

网工内推 | 云平台运维专场,IE认证优先

01 中科创达 招聘岗位:云平台运维 职责描述: 1、驻场在客户单位处办公,负责H3C品牌的网络、安全、存储、云平台、服务器等软硬件设备的运行监控与管理,包括日常巡检、日常维护等工作; 2、技术支持,为客户…

各牌浏览器设置地址栏显示完整URL

有时候,我们在浏览器的地址栏输入URL后,需要查看完整的URL路径,比如想看到是http协议还是https协议。 目前大多数浏览器都直接将协议头隐藏,需要复制出地址,或者点击地址栏才能看到,比较麻烦。 浏览器支持通…