动态数组声明的方式不同

时间:2013-03-09 18:17:54

标签: c++ arrays heap

我知道int* array = new int [n];在堆中分配内存空间。

但是如果我在代码块中声明类似的东西:int array[n];它会成功编译,但如果我将它移动到visual studio,它就会出错。

我想问的是:

  1. int[n]真正做了什么以及它与堆分配相比如何?他们之间有什么区别?

  2. 如果我使用int array[n]代替int* array = new int [n];,可能会出现什么错误?

4 个答案:

答案 0 :(得分:4)

int array[n]在堆栈上声明一个数组,而不是堆。在标准C ++中,n必须是编译时常量,但是有些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时常量n。它不是标准的,可能不应该使用。

int array[n]会导致int* array = new int [n];以上的一些问题:

  • 如果n足够大,可能导致堆栈溢出。或者,如果数组是类成员,并且您创建了该类的大型数组。
  • 如果array是班级成员移动可能与复制
  • 一样昂贵
  • 如果array是一个类成员并且你已经给出了数组和move类的指针,那么指针现在指的是一个移动后的对象,或者如果对象是随机存储器的话。也被毁了。不管怎样,不好。

答案 1 :(得分:3)

GCC在C ++中有一个扩展,它允许int array[n],其中n不是编译时常量值。在这种情况下,标准语言不允许您对n使用非常量值(在C99中允许)。

答案 2 :(得分:3)

如果我理解你的问题,那么我可以回答这两个问题。

  1. int array[10]在堆栈上分配,而int *array = new int[10]在堆上分配。通常,堆栈数组仅使用恒定数量的元素,因此在C90中不允许int array[n](只要n不是常量)。

  2. MinGW(代码块在Windows上使用的GCC编译器的版本)有一个扩展,允许您在C90模式下编写int array[n],其中n不是常量。 Visual C ++不允许这样做。

答案 3 :(得分:2)

当您编写int array[n]时,表示您正在执行静态分配。即将在编译时分配内存。因此,在此使用可变长度将导致编译时错误。