C++ 堆和栈 内存 1.基本概念 2.分配
转自:https://www.zhihu.com/question/281940376
https://www.cnblogs.com/Yekko/p/13508941.html
这两个链接里说的有不一样的地方,到底以哪个为准,之后看cpprimer再确认。
堆,英文是 heap,在内存管理的语境下,指的是动态分配内存的区域。这个堆跟数据结构里的堆不是一回事。这里的内存,被分配之后需要手工释放,否则,就会造成内存泄漏。
- `new` 和 `delete` 操作的区域是 free store
- `malloc` 和 `free` 操作的区域是 heap
但 `new` 和 `delete` 通常底层使用 `malloc` 和 `free` 来实现,所以 free store 也是 heap。
栈,英文是 stack,在内存管理的语境下,指的是函数调用过程中产生的本地变量和调用数据的区域。这个栈和数据结构里的栈高度相似,都满足“后进先出”(last-in-first-out 或 LIFO)。
其中还提到了C++中的RAII,对堆的管理机制,目前还没学到,所以先不看。
2.分配
堆分配时需要连续的空间;栈式增长一般发生在函数调用的时候,
void foo(int n) { … } void bar(int n) { int a = n + 1; foo(a); } int main() { … bar(42); …
它的栈的变化:
栈上的内存分配只需移动指针,释放也只是移动指针,因为栈是后入先出的特性,所以也不会存在内存碎片。
就算发生了异常,栈内定义的对象也会自动调用析构函数。