我知道 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
是一个类成员并且您已经给出了指向该数组的指针并移动
类,那么这些指针现在指的是一个移动后的对象,或者如果如果对象也被销毁,则为随机内存。无论哪种方式,都不好。
关于c++ - 不同方式的动态数组声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314213/