(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 分配内存。
结论:
自由存储区可以在堆上,但两者并非等价。