c编译程序占用的内存分为栈区 \ 堆区 \ 未初始化数据区 \ 初始化数据区 \ 代码区
- 未初始化数据区(BSS):存放未初始化的全局变量,属于静态内存分配,即程序一开始就将其清零
- 初始化数据区\静态数据区(DATA):存放已初始化的全局变量\静态变量\常量
- 代码区:存放程序的执行代码;
- 栈区(stack):存放函数的参数值 \ 局部变量的值,由编译器自动释放分配;
- 堆区(heap):用于动态的内存分配.用户使用malloc或new函数分配,用户通过free或delete函数释放.
malloc\free和new\delete区别:
相同点:
都是在堆区申请内存,需要手动申请,手动释放;
不同点:
1.malloc属于c语言提供的系统函数,有函数开销,需要手动计算申请的内存大小;
2.new属于c++提供的关键词,没有函数开销,会自动计算申请的内存大小;
例:int *a = new; //自己计算
int *a = malloc(sizeof(int)); //手动计算
3.delete调用一次析构函数,delete[]多次调用析构函数,一般与new[]配合使用;
4.new可以调用malloc实现,但malloc不能调用new实现
5.malloc分配内存后,如果使用过程中发现内存不足,可以使用realloc函数重新进行内存分配,实现内存扩充.
6.new没有这样直观的配套设施类扩充内存;