我最近在学习C / C ++,但我对动态内存分配和堆之间的区别感到困惑。请告诉我c和c ++中动态内存分配和堆之间的区别
答案 0 :(得分:2)
动态内存分配通过静态内存分配来区分自己,所以如果你将它与堆进行比较,那就是错误的比较。
静态存储器在程序启动时分配,通常以本地或全局变量的形式。例如:
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”。
答案 1 :(得分:1)
在C和C ++中有4种类型的分配。用于描述变量分配类型的术语是存储持续时间。类型是:
{ int x; }
int thread_local x;
)static int x;
)new int;
)malloc(4);
)术语堆是一般编程术语,而不是C ++编程术语。它对应于C ++中的动态存储持续时间。出于历史原因,它被称为 heap 。 C使用术语已分配而不是动态。
动态存储会持续到您手动释放它为止。声明后,自动存储将持续到下一个}
。静态存储一直持续到程序结束。线程存储一直持续到线程结束。
答案 2 :(得分:0)
静态内存分配:变量的生命周期是自动的,即编译器负责在程序中的非常特定的点创建和销毁变量(当变量被创建/超出范围时)
动态内存分配:对象的创建和销毁由程序员处理,可以在程序执行的任何时候发生
stack:静态内存分配(以及其他东西)的常规编译器在常规系统上的常规实现
heap:通常的编译器在常规系统上的通常实现,用于动态内存分配
堆栈和堆是编译器在程序的地址空间中处理的内存区域。