动态内存分配和c和c ++中的堆之间的区别是什么

时间:2014-08-09 06:39:28

标签: c++ c memory-management

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

3 个答案:

答案 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;
  • (仅限C ++)动态(例如new int;
  • (仅限C)已分配(例如malloc(4);

术语是一般编程术语,而不是C ++编程术语。它对应于C ++中的动态存储持续时间。出于历史原因,它被称为 heap 。 C使用术语已分配而不是动态

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

答案 2 :(得分:0)

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

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

  • stack:静态内存分配(以及其他东西)的常规编译器在常规系统上的常规实现

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

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