2018-09-03 22:37:06 +08:00
<!-- GFM - TOC -->
* [0. 进程内存空间中,堆和栈的区别 ](#0-进程内存空间中,堆和栈的区别 )
<!-- GFM - TOC -->
# 0. 进程内存空间中,堆和栈的区别
> C++
堆: 动态、malloc()、new、链式分配、向上生长; 栈: 函数调用、编译器分配回收、向下生长。
https://www.cnblogs.com/sunziying/p/6510030.html
By @CyC
---
2018-09-06 11:27:22 +08:00
# 1. new 和 malloc 的区别
* 属性
> new/delete是C++关键字, 需要编译器支持。malloc/free是库函数, 需要头文件支持
* 参数
> 使用new操作符申请内存分配时无需指定内存块的大小, 编译器会根据类型信息自行计算。 malloc则需要显式指出内存的尺寸。
* 返回类型
> new操作内存分配成功时, 返回的是对象的类型指针, 类型严格与对象匹配, 无需类型转换, 因此new是符合类型安全的操作符。而malloc内存分配成功则是返回void *, 需要通过强制类型转换将void *指针转换成我们需要的类型。
* 分配失败
> new内存分配失败时, 会抛出bac_alloc异常。malloc分配内存失败返回NULL。
* 自定义类型
> new会先调用operator new 函数, 申请足够的内存( 通常使用malloc实现) 。然后调用类型的构造函数, 初始化成员变量, 最后返回自定义类型的指针。delete先调用析构函数, 然后调用operator delete函函数释放内存( 通常底层使用free实现)
* 重载
> C++允许重载new/delete操作符, 特别的, 布局new的就不需要为对象分配内存, 而是指定了一个地址作为内存的起始区域, new在这段内存上为对象调用构造函数完成初始化工作, 并返回此地址。malloc不允许重载。
* 内存区域
> new 操作符从自由存储区( free store) 上为对象动态分配内存空间, 而malloc函数从堆上动态分配内存。自由存储区是c++基于new操作符的一个抽象概念, 凡是通过new操作符进行内存申请, 该内存即为自由存储区。而堆是操作系统中的术语, 是操作系统中的术语, 是操作系统所维护的一块特殊内存, 用于程序内存的动态分配, C语言使用malloc从堆上分配内存, 使用free释放已分配的对应内存。自由存储区不等于堆, 如上所述, 布局new就可以不位于堆中。
* 能够直观地重新分配内存
> malloc可以通过relloc进行内存重新分配实现内存扩充。new没有这样的直观配套设施来扩充内存。