c++ (maloc/free) 和 (new/delete)有什么区别?以及自由存储区和堆区的区别。

本文对比了new, delete与malloc, free在内存分配和操作上的差异,强调了自由存储区的概念,并澄清了其与堆的关系。重点讲解了它们在内存区域、操作行为、用法和c++内存布局中的角色。

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

(maloc/free) 和 (new/delete)有什么区别?

(1). 申请内存所在位置不同
	
	new 和 delete 是从自由存储区中为对象动态分配或者释放内存;
	而malloc 和 free 是从堆上动态分配或者释放内存。
	
(2). 类型不同
 	
 	new 和 delete 是操作符;而malloc 和 free 是函数。

(3). 具体操作不同
	
	new 和 delete 会调用类的构造和析构函数;
	而malloc 和 free 只是单纯的分配和释放内存。
	
(4). 用法不同
	
	new 使用的时候不需要指定要分配的内存大小;
	malloc 需要指定内存大小。

自由存储区又是什么概念呢?

当我看到上面的区别中第一点的时候,就有点迷惑了,因为在此之前我一直都是
觉得malloc、free、new和delete都是在堆中分配内存的。

下面来介绍一下。


自由存储区和堆区的区别

首先,c++的内存布局:

c++中内存分为五个区块,分别是堆、栈、自由存储区、
常量存储区、全局/静态存储区。

它们分别都用来做什么可以自行研究一下,如果需要可以评论,我来整理一下。

自由存储区和堆究竟是什么关系呢?

堆 是操作系统中维护的切实存在的一块内存区,它提供了动态分配的功能;
malloc() 和 free() 是在堆中分配和释放内存的,这一点是肯定的;

自由存储区 只是c++中的一种抽象概念。
通过new来分配的内存都被称为自由存储区,而new可以从堆上分配内存,也可以
从全局存储区来分配内存,而new 到底从哪块内存区中分配内存还是要看这个操
作符的实现细节,而这个操作符可以被程序员重载。

所以自由存储区并非是具体的某块内存区,而是所有被new分配的内存统称为自由
存储区。

基本上所有的c++编译器都是默认使用堆区为new分配内存,而这个操作符是可以重载的,程序员可以改用其他内存区来为 new 分配内存。


结论:

自由存储区可以在堆上,但两者并非等价。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿声载道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值