C++|内存管理(1)

目录

C/C++内存分布

堆区

栈区

静态存储区

代码区

总结

C语言中动态内存管理方式:malloc/calloc/realloc/free

C++内存管理方式

new/delete操作内置类型

new和delete操作自定义类型

operator new与operator delete函数(重要点进行讲解)

 operator new与operator delete函数(重点)

new和delete的实现原理

内置类型

自定义类型

new的原理

delete的原理

new T[N]的原理

delete[]的原理


C/C++内存分布

可划分为四大内存分区:全局/静态存储区和代码区。不同类型的变量存放的区域不同。

堆区

由编程人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是整个程序运行期间。

使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。

new操作符本质上是使用了malloc进行内存的申请,new和malloc的区别如下:

(1)malloc是C语言中的函数,而new是C++中的操作符。

(2)malloc申请之后返回的类型是void*,而new返回的指针带有类型

(3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。

栈区

系统进行内存的管理。主要存放函数的参数以及局部变量

在函数完成执行,系统自行释放栈区内存,不需要用户管理。

整个程序的栈区的大小可以在编译器中由用户自行设定,VS中默认的栈区大小为1M,可通过VS手动更改栈的大小。64bits的Linux默认栈大小为10MB,可通过ulimit -s临时修改。 

静态存储区

全局/静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量、全局变量和常量

注意:

(1)静态存储区内不存在未初始化的变量,是因为静态存储区内的变量若不显示初始化,则编译器会自动以默认的方式进行初始化。

(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。

静态存储内的常变量是全局变量,与局部常变量不同,

区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,

而全局常变量存放于静态常量区则不可以间接修改。

(3)字符串常量存储在全局/静态存储区的常量区。

代码区

存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

总结

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

C语言中动态内存管理方式:malloc/calloc/realloc/free

void Test ()
{int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 这里需要free(p2)吗?free(p3 );
}

C++内存管理方式

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

new/delete操作内置类型

void Test()
{// 动态申请一个int类型的空间int* ptr4 = new int;// 动态申请一个int类型的空间并初始化为10int* ptr5 = new int(10);// 动态申请10个int类型的空间int* ptr6 = new int[10];delete ptr4;delete ptr5;delete[] ptr6;
}

注意:

申请和释放单个元素的空间,使用new和delete操作符,

申请和释放连续的空间,使用new[]和delete[]。

new和delete操作自定义类型

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

operator new与operator delete函数(重要点进行讲解)

 operator new与operator delete函数(重点)

new和delete是用户进行动态内存申请和释放的操作符,

operator new 和operator delete是系统提供的全局函数,

new在底层调用operator new全局函数来申请空间,

delete在底层通过operator delete全局函数来释放空间。

operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。

operator delete: 该函数最终是通过free来释放空间的

new和delete的实现原理

内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,

不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间

自定义类型

new的原理

1. 调用operator new函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间

new T[N]的原理

1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申

2. 在申请的空间上执行N次构造函数

delete[]的原理

1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

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

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

相关文章

LSPosed 安装、模块开发笔记

前言 最近几天从零接触LSPosed(xposed),需要自己开发模块进行使用,做一下学习笔记。 本篇内容在已经root并且成功刷入了Magisk的基础上进行。 注意:LSPosed只支持安卓版本8.x的设备。如果在8.0以下需要使用xposed。他们的模块开发接口也是一样…

C语言经典例题-16

1.按照格式输入并交换输出 题目描述: 输入两个整数,范围-231~231-1,交换两个数并输出。 输入描述: 输入只有一行,按照格式输入两个整数,范围,中间用“,”分隔。 输出描述: 把两个整数按格式输出,中间用“…

R语言手把手教你进行支持向量机分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

孩子学编程对学习有帮助吗?过程中可能遇到哪些困难?

孩子学习编程可以帮助他们培养逻辑思维、解决问题的能力、创造力和耐心。编程还可以提高孩子的数学和科学技能,培养他们的计算机技术和信息技术意识。此外,学习编程还可以培养孩子的团队合作意识和沟通能力。 另外,家长和老师还可以通过激励…

4.2 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NO MATCH”

方法一:在程序内部设置两个字符串内容,终端返回是否匹配 运行效果: 思路: 1、先比较两个字符串的长度,如果长度不一样,则两组字符串肯定不匹配;如果长度一样,再进行内容的匹配 2、如…

鸿蒙应用开发之Web组件7

前面学习了Web组件选择文件文件上传的处理,现在来学习怎么样在一个Web容器里,再打开一个窗口来显示内容,相当于弹出另一个Web组件窗口,其实相当于两个Web组件同时在操作的方式。这种方式需要小心处理,否则会挂起整个系统。 如果在一个网页里有打一个新窗口的需求,比如像下…

大模型崛起与就业危机

大模型,特别是像我这样的人工智能,最有可能首先替代那些重复性高、标准化程度高、不需要太多人类直觉和情感判断的工作。这些工作通常包括数据输入、初级数据分析和处理、简单的客户服务任务等。例如,可以自动化的一些岗位包括: 1…

zabbix监控mariadb

zabbix 服务端安装请参阅:红帽 9 zabbix 安装流程_红帽安装zabbix-CSDN博客 源码包安装mariadb请参阅:源码包安装mariadb_mariadb 11 源码编译安装-CSDN博客 在MariaDB中,你需要创建一个专门的用户,用于Zabbix进行监控。这个用户…

研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理和基于Github的尝试

一、研究幽灵漏洞及其变种(包括但不限于V1-V5)的攻击原理 1.1 基本漏洞原理(V1) 幽灵漏洞的基本原理是由于glibc库中的gethostbyname()函数在处理域名解析时,调用了__nss_hostname_digits_dots()函数存在缓冲区溢出漏洞。 具体来说,__nss_hostname_digits_dots()使用一个固定…

绝地求生:艾伦格回归活动来了,持续近1个月,新版本皮肤、G币等奖励白嫖

嗨,我是闲游盒~ 29.2版本更新在即,新活动来啦!目前这个活动国内官方还没发,我就去台湾官方搬来了中文版方便大家观看,也分析一下这些奖励应该怎样才能获得。 新版本将在周二进行约9小时的停机维护,请注意安…

JSON在线解析及格式化验证 - JSON.cn网站

JSON在线解析及格式化验证 - JSON.cn https://www.json.cn/

powerbuilder如何操作mongdb

使用 PowerBuilder 通过 ODBC 来直接操作 MongoDB 是不常见的,因为 MongoDB 是一个 NoSQL 数据库,其数据模型与关系型数据库不同,并且 MongoDB 官方并没有直接提供 ODBC 驱动程序。然而,你可以通过一些间接的方法来实现这个目标。…

hdfs 中 Map Tas工作机制(Hadoop,hive,hdfs)

Map Tas (1)Read阶段 : Map Task通过用户编写的RecordReader ,从输入InputSplit中解析出一个个key/value。 (2)Map阶段: 该节点主要是将解析出的key/value交给用户编写map()函数处理 &#x…

anaconda虚拟环境pytorch安装

1.先创建conda的虚拟环境 conda create -n gputorch python3.102.激活刚刚创建好的虚拟环境 conda activate gputorch3.设置国内镜像源 修改anaconda的源,即修改.condarc配置文件 .condarc在 home/用户/user/ conda config --add channels https://mirrors.tuna.…

【专利】一种日志快速分析方法、设备、存储介质

公开号CN116560938A申请号CN202310311478.5申请日2023.03.28 是我在超音速人工智能科技股份有限公司(833753) 职务作品,第一发明人是董事长夫妇,第二发明人是我。 ** 注意** : 内容比较多,还有流程图、界面等。请到 专利指定页面…

初始Django

初始Django 一、Django的历史 ​ Django 是从真实世界的应用中成长起来的,它是由堪萨斯(Kansas)州 Lawrence 城中的一个网络开发小组编写的。它诞生于 2003 年秋天,那时 Lawrence Journal-World 报纸的程序员 Adrian Holovaty 和…

自作聪明的AI? —— 信息处理和传递误区

一、背景 在人与人的信息传递中有一个重要问题——由于传递人主观处理不当,导致信息失真或产生误导。在沟通交流中,确实存在“自作聪明”的现象,即传递人在转述或解释信息时,根据自己对信息的理解、经验以及个人意图进行了过多的…

配置 IDEA 识别自定义规则的 Dockerfile 文件

目录 配置所在位置解决方案其他 配置所在位置 打开 IntelliJ IDEA,然后转到顶部菜单中的 “File” > “Settings”(Windows/Linux)或 “IntelliJ IDEA” > “Preferences”(macOS)。 在弹出的设置窗口中&#x…

Linux signal

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <errno.h> /* * signal 函数的使用方法简单&#xff0c;但并不属于 POSIX 标准 * * 而 POSIX 标准定义的信号处理接口是 sigaction 函数 */ #i…

责任链模式:原理与实现解析,及其应用场景代入

责任链模式的作用&#xff1a;复用和扩展&#xff0c;在实际的项目开发中比较常用&#xff0c;特别是框架开发中&#xff0c;我们可以利用它们来提供框架的扩展点&#xff0c;能够让框架的使用者在不修改框架源码的情况下&#xff0c;基于扩展点定制化框架的功能。 这里主要介…