C ++中的动态内存分配需要new运算符new?

时间:2011-07-28 23:20:38

标签: c++ memory dynamic new-operator

int d;
cin >> d;
int asdf[d];

这被视为动态内存分配吗?根据{{​​3}},似乎我甚至不能编译它,因为不使用new运算符的数组只能以常量大小声明,也许我读错了。 (我正在使用CodeBlocks和GNU CCC编译器)

它和

之间有什么区别
int d;
int *asdf;
cin >> d;
asdf = new int[d];

在删除数组之前,使用new生成的数组是唯一的区别,而第一个数组在离开范围后会立即释放吗?

2 个答案:

答案 0 :(得分:9)

int x[n];可变长度数组(VLA),它具有自动存储持续时间(即“在堆栈上”)。它在C89或C ++ 98/03中无效,但它是在C99中引入的,并且通常作为扩展名提供,例如在GCC。

在一些具有非标准alloca()功能的平台上也可以模仿该功能,该功能在VLA变得普遍之前使用。

答案 1 :(得分:1)

使用第一种方法分配的内存来自分配给应用程序的堆栈。当你使用new时,内存是从堆中分配的,堆可以提供足够的内存,而不是从堆栈中获取。但是要使用new,你的变量必须是与数组相同类型的指针。指针变量保存第一个存储单元的地址。 int * a = new int [x];将保存x个存储单元,如果在程序仍在运行时专门删除指针,将被释放。

相关问题