C++内存管理

参考:https://chenqx.github.io/2014/09/25/Cpp-Memory-Management/

C++的内存存储主要包括以下几个方面:

堆:由new分配的内存块,需要用delete释放,编译器不管释放。如果不释放,程序结束的时候会被系统收回。

栈:函数内部的局部变量存储区,函数结束时这些存储单元被自动释放,栈内存分配运算内置于处理器的指令集,效率很高,但是可分配内存容量有限。

自由存储区:由malloc分配的内存,需要由free来释放。

静态/全局存储区:全局变量和静态变量保存在同一块存储区。

常量存储区:常量存储区不允许修改。

堆栈区别:

  1. 管理方式不同:栈是自动管理,堆需要手动回收
  2. 空间大小不同:栈有固定大小,堆在32位系统中一般可达到4G
  3. 能否产生碎片不同:栈不会产生碎片,每次入栈出栈都在栈顶,不会在栈中间弹出一块内存。堆会产生碎片,使程序效率降低。
  4. 生长方向不同:堆向上生长,栈向下生长,会有固定大小。
  5. 分配方式不同:堆动态分配,栈可以静态也可以动态分配,栈的静态分配由编译器完成,动态分配由alloc函数完成,释放的时候也是由编译器完成。
  6. 分配效率不同:栈是操作系统提供的数据结构,会在底层进行支持,分配专门的寄存器存储栈的地址,压栈出栈都有专门的指令执行。堆由C、C++函数库提供,如果在堆内存中查找不到合适大小的内存块,则有可能调用系统功能增加程序数据段的内存空间。

注意点:

1.指针声明的时候要初始化为NULL,不然会乱指。

comments powered by Disqus