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);
  …

它的栈的变化:

C++ 堆和栈  内存
1.基本概念
2.分配

栈上的内存分配只需移动指针,释放也只是移动指针,因为栈是后入先出的特性,所以也不会存在内存碎片。

就算发生了异常,栈内定义的对象也会自动调用析构函数。