我知道int* array = new int [n];
在堆中分配内存空间。
但是如果我声明这样的东西:int array[n];
在代码块中它编译成功,但是如果我把它移到 Visual Studio,它就会出错。
我想问的是:
真正做什么
int[n]
以及它与堆分配相比如何?它们之间有什么区别?如果我使用
int array[n]
而不是,可能会出现什么错误int* array = new int [n];
?
我知道int* array = new int [n];
在堆中分配内存空间。
但是如果我声明这样的东西:int array[n];
在代码块中它编译成功,但是如果我把它移到 Visual Studio,它就会出错。
我想问的是:
真正做什么int[n]
以及它与堆分配相比如何?它们之间有什么区别?
如果我使用int array[n]
而不是,可能会出现什么错误int* array = new int [n];
?
int array[n]
在堆栈上声明一个数组,而不是在堆上。在标准 C++n
中必须是编译时间常数,但是一些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时间常数n
。它不是标准的,可能不应该使用。
int array[n]
可能会导致几个问题int* array = new int [n];
:
n
足够大,您可能会导致堆栈溢出。或者,如果该数组是一个类成员并且您创建了一个该类的大数组。array
班级成员搬家可能和复制一样昂贵array
是类成员并且您已经给出了指向数组和move
类的指针,则指针现在引用移动后的对象,或者如果对象也被破坏,则指向随机内存。不管怎样,不好。如果我正确理解你的问题,那么我可以回答这两个问题。
int array[10]
分配在栈上,而int *array = new int[10]
分配在堆上。通常,堆栈数组仅适用于恒定数量的元素,因此int array[n]
在 C90 中是不允许的(只要n
不是恒定的)。
MinGW(这是代码块在 Windows 上使用的 GCC 编译器的版本)有一个扩展,它允许您int array[n]
在 C90 模式下编写,其中n
不是恒定的。Visual C++ 不允许这样做。
GCC 在 C++ 中有一个扩展,它允许int array[n]
wheren
不是编译时常量值。在这种情况下,标准语言不允许您使用非常量值n
(在 C99 中是允许的)。
当您编写时int array[n]
,这意味着您正在执行静态分配。即内存将在编译时分配。所以在这里使用可变长度会导致编译时错误。