【C++系列】-----------内存管理

c++内存管理(涉及:数据在内存中的分布、new和delete使用、动态内存管理等)

文章目录

  • c++内存管理(涉及:数据在内存中的分布、new和delete使用、动态内存管理等)
  • 前言
  • 一、C/C++内存分布
  • 二、C++中动态内存管理
    • 2.1、 new/delete操作内置类型
    • 2.2、 new和delete操作自定义类型
  • 总结


前言

众所周知,c++没有提供(垃圾)回收机制,所以写C/C++程序常常会面临内存泄漏等问题,但是c++提供了对内存精细控制的方式,允许程序员以动态和手动的方式分配和释放内存。这种能力既带来强大的灵活性,也伴随着一定的挑战。下面我们一起看一下如何使用这些方法。


一、C/C++内存分布

下面我们通过一些经典例题来了解一些

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";//比较特殊,仔细阅读一下const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3)
}

1、选择:A、栈 B、堆 C、数据段(静态区) D、代码段(常量区)

globalVar在哪里?____ staticGlobalVar在哪里?____
staticVar在哪里?____ localVar在哪里?____
num1 在哪里?____
char2在哪里?____ *char2在哪里?___
pChar3在哪里?____ *pChar3在哪里?___

通过上面代码我们可以看到:
glovalVar是在Test函数体外创建的变量,即为全局变量,存放在数据段(静态区)中。
变量staticGlobalVar,也处在函数体之外,同时被关键字static修饰,即为全局静态变量,存放在数据段(静态区)中。
staticVar是在Test函数内部创建的静态变量,即为局部静态变量,存放在数据段(静态区)中。
localVar是在Test函数内部创建的变量,即为局部变量,存放在栈区。
num1是在Tese函数内部创建的数组的数组名,即为局部创建的多个普通变量,存放在栈区。
char2是在Test函数内部创建的数组的数组名,同num1。
、* char2是比较特殊的,因为char char2[] = “abcd”;这句代码的实质是用右边的字符串初始化数组(存储在栈中),在代码段(常量区)中有“abcd\0”字符串,拷贝一份存储在char2数组中(abcd只是一份拷贝对象,所占空间还是栈上开辟的)因此 * char2存放在栈中。
pChar3是在Test函数内部创建的const修饰的常指针变量(这里拓展个知识:const在修饰指针时,在*之前修饰,是指 指针指向的),实质还是一个局部创建的变量,只是该变量的值不能修改,因此pChar3存放在栈区。
*pChar3是对数组的的首元素进行解引用,*pChar3是常量字符串的第一个字符,字符常量存放在代码段(常量区)。
*ptr1是对数组的的首元素进行解引用,ptr1是通过动态开辟的空间,动态开在堆区申请空间,因此ptr1存放在堆区。
在这里插入图片描述
说明

  1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(了解一下)
  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段–存储全局数据和静态数据。
  5. 代码段–可执行的代码/只读常量

二、C++中动态内存管理

c语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

2.1、 new/delete操作内置类型

 void Test(){// 用法上,比malloc更简洁,不需要计算类型大小,并且可以对空间内容初始化(这点对内置类型还不太明显)int* p = (int*)malloc(sizeof(int));int* ptr4 = new int;// 动态申请一个int类型的空间并初始化为10int* ptr5 = new int(10);// 动态申请10个int类型的空间int* ptr6 = new int[10];// 动态申请10个int类型的空间,并将他们初始化int* ptr7 = new int[10]{1,2,3,4,5,6,7,8,9,10};delete ptr4;delete ptr5;delete[] ptr6;delete[] ptr7;free(p);}

在这里插入图片描述

2.2、 new和delete操作自定义类型

class A{public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}private:int _a;};int main()
{A* p1 = (A*)malloc(sizeof(A));if (p1 == NULL){perror("malloc fail");exit(-1);}free(p1);A* p2 = new A(1);delete p2;return 0;
}

函数malloc()、free()与关键字new、delete最大的区别是,new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数,而malloc函数仅会开辟与自定义类型(A)等大字节的空间,并不会完成初始化工作。

总结

这次的博客就到这了,本来计划将new/delete的使用和底层讲一下的,但是篇幅过长,阅读起来会烦躁。

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

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

相关文章

SpringBoot框架:作业管理系统构建之道

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有管…

Linux字体更新 使用中文字体

问题描述&#xff0c;处理之前&#xff0c;中文乱码 处理后的结果 压缩需要上传的字体&#xff1a; 上传到LInux的字体目录&#xff0c;上传后解压出来 刷新字体&#xff1a; fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…

【书生.浦语实战营】——入门岛

【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch &#xff1a;创建文件mkdir &#xff1a;创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…

VirtualBox 解决虚拟机Cable Unplugged 无法上网问题

问题描述 VirtualBox 中的虚拟机无法上网&#xff0c;在虚拟机中查看网络设置显示 Cable Unplugged。 解决方案 选择VirtualBox 上方任务栏的控制->设置->网络&#xff0c;勾选接入网线即可解决。

win10下MMSegmentation自定义数据集

下载1.2.1版本: Releases open-mmlab/mmsegmentation GitHub 安装环境 本地torch环境为1.9.1 pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" 报mmcv版本不匹配的问题,形如:MMCV==X.X.X is used but incompatible. Please inst…

CSS网格布局

前言 希望元素按照网格的方式进行布局&#xff0c;最简单的方式就是利用网格布局&#xff0c;如图所示&#xff1a; 网格布局 设置网格布局的核心属性&#xff1a; ① display: grid 设置容器为网格布局容器&#xff08;如果希望设置行内的网格容器&#xff0c;可以设置disp…

童年的玩具:燕麦时钟

也不知道是谁传下来的&#xff0c;燕麦时钟。 燕麦是野生的&#xff0c;通常在麦地里面的都被拔掉&#xff0c;但是土埂上面的还幸存下来。 这个燕麦成熟后&#xff0c;上面有个麦芒由直的变弯&#xff0c;越是90度&#xff0c;越成熟。 选一根90度的成熟麦芒。把下部插入一团…

如何在BSV区块链上实现可验证AI

​​发表时间&#xff1a;2024年10月2日 nChain的顶尖专家们已经找到并成功测试了一种方法&#xff1a;通过区块链技术来验证AI&#xff08;人工智能&#xff09;系统的输出结果。这种方法可以确保AI模型既按照规范运行&#xff0c;避免严重错误&#xff0c;遵守诸如公平、透明…

2024年还有多少人在使用PHP?

根据W3Techs的最新数据&#xff0c;2024年PHP仍然支持76.5%的网站&#xff0c;这一数字在一年内下降不到1%&#xff08;截至2023年为77.3%&#xff09;。 尽管这一数字有所下降&#xff0c;但这表明PHP仍然是Web开发中非常流行的语言。 根据JetBrains的调查&#xff0c;在过去…

在这里游玩和创造,见证实时互动和 AI 的融合爆发丨年末场 RTE Open Day@RTE2024 回顾

RTE2024 第十届实时互联网大会上周末在北京圆满结束了&#xff0c;不知道大家体验交流得如何&#xff1f;可能是因为本来入秋的北京悄然升温&#xff0c;又或者是那两天的观众都很热情&#xff0c;25-26 号的活动现场特别像是一场夏天的聚会。 RTE Open Day 马不停蹄来到了第五…

智能体联手微信,打造24小时在线的全能AI机器人,除了聊天,还能接商单

最近在我们的智能体学习群里&#xff0c;微信AI机器人成了小明星&#xff0c;它功能丰富&#xff0c;机智幽默&#xff0c;成为了大家的心头好&#x1f617; 比如&#xff0c;它会非常热情的欢迎新入群的小伙伴&#xff0c;并且能够很机智的将小伙伴的名字巧妙地融入到欢迎词中…

采购退料单集成方案:从旺店通到金蝶云的API实现

14-采购退料单集成方案&#xff1a;旺店通旗舰奇门数据集成到金蝶云星空 在企业的供应链管理中&#xff0c;采购退料单的高效处理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将旺店通旗舰奇门的数据无缝对接到金蝶云星空。本次分享的案例…

MyBatis的高级映射及延迟加载

多对一&#xff1a; 多种方式&#xff0c;常见的包括三种&#xff1a; 第一种方式&#xff1a;一条SQL语句&#xff0c;级联属性映射。 第二种方式&#xff1a;一条SQL语句&#xff0c;association。 第三种方式&#xff1a;两条SQL语句&#xff0c;分步查询。&#xff08;这…

bugku中web题-source

Web安全解题基础三件套思路 信息收集与目录扫描 御剑扫描&#xff1a;探测网站目录结构&#xff0c;找潜在可访问路径&#xff0c;如管理员后台等目录。dirsearch扫描后台目录&#xff1a;配置参数后扫描&#xff0c;分析返回有意义状态码的目录&#xff0c;可能包含后台管理界…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…

shodan6-7---清风

shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控&#xff0c;这里可以对ip进行扫描&…

Spring5学习记录(四)声明式事务管理

Spring5学习记录&#xff08;四&#xff09;声明式事务管理 一、事务管理1、事务四个特性ACID2、事务的两种方式 二、基于注解实现声明式事务管理1、配置xml文件2、添加事务注解 Transactional 三、声明式事务管理的参数配置1、propagation&#xff1a;事务传播行为2、isolat…

Linux上python离线安装教程

一. 安装Python 1. 下载python离线包 安装包下载地址&#xff1a;https://www.python.org/downloads/source/ 我下载的是Python 3.10.14 下面是linux服务器上的部署过程 2. 系统更新 sudo yum update -y 3. 安装必要的依赖项 sudo yum groupinstall “Development Tools” -y…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…