内存分配方式
在C++中,内存有5种方式:
栈:执行函数时,函数内部局部变量的存储单元在栈中创建,函数结束时,销毁。先进后出的存储方式。
堆:动态分布的区域,由new分配内存块。记得一个new一定对应一个delete。否则会造成内存泄漏。
自由存储区:是由malloc分配的内存块。一个malloc要对应一个free。
全局/静态存储区:全局变量和静态变量的居住点。
常量存储区:存储不允许修改的常量。
堆和栈的区别
- 管理方式不一样:栈由编译器自动管理,堆由我们控制。
- 空间大小不一样:栈内存没啥限制,堆内存有大小。
- 能否产生碎片:栈不会产生碎片,堆频繁new/delete会产生碎片。
- 生长方式不同:栈生长方向是内存地址减小的方向,堆是内存地址增加的方向。
- 分配方式不同:栈分配方式方式有动态和静态分配。堆只能动态分配。
- 分配效率不同:栈的效率高。
打个比喻:
栈:这里就像公司宿舍一样,由公司统一安排,在公司合同(函数)期间,可以居住,一旦到期,就得搬走。
堆:这里就像酒店一样,啥时候走由我们自己决定,只要交钱就行。
举个栗子:
void f() { int* p=new int[6]; }
这里面包含了栈和堆。
让我们来分析一下,首先看到new,那就是分配了堆空间,大小为6个int大小。有指针,由编译器分配栈空间。在栈空间中存放着一个指针p,指针p指向一块堆空间。