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 ++中的动态内存分配和堆有啥区别的主要内容,如果未能解决你的问题,请参考以下文章