一.C++内存分布
要研究C++的内存分布,首先要明白C++的内存是如何分布?
1.栈(Stack):又叫堆栈,存储非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2.内存映射段:用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信。
3.堆(Heap):用于程序运行时的动态内存分配(如:malloc,realloc,calloc,new等),堆是可以向上增长的。
4.静态区(Static):包括数据段和代码段,其中数据段用来存储全局数据和静态数据,代码段用来存储可执行代码,只读常量。
malloc、calloc、realloc的区别?
1)malloc的函数原型:void* malloc(size_t size);
2)calloc的函数原型:void* calloc(size_t num,size_t size);
3)realloc的函数原型(要扩充的参数内存大小的指针名,新的大小):
void* realloc(void* memblock,size_t size);
区别:
1)malloc不能初始化所申请的内存空间
2)calloc所申请的空间内容初始化时,如果是为字符类型或整数类型的元素分配内存,那这些元素将保证会被初始化为0;如果是为指针类型的元素分配内存,那这些元素通常会被初始化为空;如果是为实型数据分配内存,则会被初始化为浮点型的0.
3)realloc可以对给定的指针所指的空间进行扩大或缩小,无论是扩大还是缩小,原有的内存中的内容保持不变,当然,新申请的空间的大小如果小于原来的大小,就会导致数据丢失。
4)realloc申请的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;如果没有足够多剩余的内存,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将会被free掉,realloc返回新的内存地址。当给realloc设置的参数指针若为NULL或0时,就相当于malloc的作用。
二.C++内存管理方式
1.new和delete操作内置类型
C++提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理
void Test(){
int *pt1 = new int;//动态申请一个int类型的空间
int *pt2 = new int(5);//动态申请一个int