new && delete

本文详细介绍了C++中new和delete操作符的功能及其使用场景,解释了为何使用new后必须匹配delete以避免内存泄漏。此外,还阐述了C语言可执行代码结构及不同内存区域的用途,包括静态存储区域、栈和堆的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. new

new int

new int[10]

new Stash

--分配int大小(4字节)的内存空间

--分配10个int大小(40字节)的内存空间

--分配类需要的空间,注意定义类(哪怕是动态的)的时候会自动调用构造函数

--返回分配的地址 int *p=new int;

--有一个数据链表会记录申请空间的地址与大小

 

2. delete

delete p;

delete[] p;

--收回空间

--类的对象,先析构,再收回空间

--[]表明会回收数组的整个空间(如果是类的数组,则析构整个类的数组)

--根据上述的数据链表来收回相应的空间

 

3. 为什么new后要delete?

防止内存(堆)泄漏。

 

4. C语言可执行代码结构

代码段

可执行代码、字符串常量

数据段

已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据

BSS段

未初始化全局变量,未初始化全局静态变量

局部变量、函数参数

动态内存分配

 

--分页分段机制:划分程序页、数据页;一页可分为若干段;

--程序页中包括代码段,数据页中包括数据段、BSS段、栈段、堆段;

--在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间;

--栈段亦由操作系统分配和管理,而不需要程序员显示地管理,生命周期为函数执行期间;

--堆段由程序员自己管理,即动态地申请和释放空间。

 

5. 内存数据分配

静态存储区域:

--编译的时候分配,在整个程序运行期间都存在,主要存放静态数据、全局static数据和常量;

--数据区的大小由系统限定,一般很大。

 

栈(堆栈、进程栈):

--主要存放函数的参数以及局部变量

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

--栈是向低地址扩展的数据结构,是一块连续的内存的区域,申请的空间超过栈的剩余空间时则overflow

--整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为1M/2M

 

堆:

--动态内存分配,C中的malloc、free或者C++中的new、delete;

--一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收;

--堆是向高地址扩展的(跟数据结构中的堆是两回事),是不连续的内存区域。系统用链表来存储空闲内存地址,链表的遍历方向是由低地址向高地址;

--堆的大小受限于计算机系统中有效的虚拟内存,可用的空间比较大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值