CS-Notes/notes/CyC 学习交流群 问题汇总.md
2018-09-06 11:27:22 +08:00

2.4 KiB
Raw Blame History

0. 进程内存空间中,堆和栈的区别

C++

动态、malloc()、new、链式分配、向上生长函数调用、编译器分配回收、向下生长。

https://www.cnblogs.com/sunziying/p/6510030.html

By @CyC


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没有这样的直观配套设施来扩充内存。