c和c ++中的动态内存分配和堆有啥区别

Posted

技术标签:

【中文标题】c和c ++中的动态内存分配和堆有啥区别【英文标题】:what's the difference between dynamic memory allocation and heap in c and c++c和c ++中的动态内存分配和堆有什么区别 【发布时间】:2014-08-09 06:39:27 【问题描述】:

我最近在学习C/C++,但是我对动态内存分配和堆的区别感到困惑,所以请告诉我c和c++中动态内存分配和堆的区别

【问题讨论】:

What and where are the stack and heap?的可能重复 考虑:The Definitive C++ Book Guide and List 动态内存分配发生在“堆”上。这些是密​​切相关的词。 感谢您的 cmets。 【参考方案1】:

动态内存分配与静态内存分配不同,因此如果将其与堆进行比较,则比较错误。

动态和静态分配是“如何”和“何时”分配内存。 堆、堆栈等是内存所在的“位置”,会影响这些区域中内存的管理方式

静态内存在程序启动时分配,通常以局部或全局变量的形式。例如:

int globalVariable = 5;
int globalArray[ 2 ] =  0, 1 ;

void main()

    int localVariable = 2;
    int localArray[ 3 ] =  1, 2, 3 ;

这些内存分配在堆栈和程序空间上。

当程序执行诸如 malloc 之类的函数或诸如“new”之类的运算符时,就会发生动态分配。例如:

void main()

    int* pointerToInt = new int;
    int* pointerToArrayOfInts = new int[2];
    //do something
    delete pointerToInt;
    delete [] pointerToArrayOfInts;

需要注意的是,变量“pointerToInt”是静态分配在堆栈上的。但是,它指向的存储“int”的内存是在该行代码运行时动态分配的,它在堆上分配内存。 “pointerToArrayOfInt”也是如此。

【讨论】:

【参考方案2】:

在 C 和 C++ 中有 4 种类型的分配。用于描述变量分配类型的术语是存储持续时间。类型有:

自动(例如 int x; 线程(例如int thread_local x;) 静态(例如static int x;) (仅限 C++)动态(例如 new int;) (仅限 C)已分配(例如 malloc(4);

这个术语是一个通用的编程术语,而不是 C++ 术语。它对应于 C++ 中的动态 存储持续时间。由于历史原因,它被称为 heap。 C 使用术语 allocated 而不是 dynamic

动态存储会一直持续到您手动释放它为止。自动存储持续到声明后的下一个。静态存储一直持续到程序结束。线程存储一直持续到线程结束。

【讨论】:

【参考方案3】:

静态内存分配:变量的生命周期是自动的,即编译器负责在程序中非常特定的点创建和销毁变量(当变量被创建/超出范围时)

动态内存分配:对象的创建和销毁由程序员处理,可以在程序执行的任何时候发生

堆栈:通常编译器在通常系统上对静态内存分配(和其他东西)的通常实现

堆:通常编译器在通常系统上的通常实现,用于动态内存分配

堆栈和堆是程序地址空间中编译器处理的内存区域。

【讨论】:

以上是关于c和c ++中的动态内存分配和堆有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--动态内存分配

C++11 中的动态对齐内存分配

c语言堆和栈,静态区的理解

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]

C之动态内存分配(三十四)

c++ 自由储存区和堆