所以我总是被告知在编译时不知道数组的大小时应该使用动态内存。例如,用户需要输入数组的大小。
int n;
cin >> n;
int array[n];
for(int ii = 0; ii < n; ii++)
{
array[ii] = ii;
}
for(int ii = 0; ii < n; ii++)
{
cout << array[ii] << endl;
}
然而这对我来说很好,我一直以为我需要使用指针和新运算符。动态内存是否仅适用于您想要更改阵列大小,释放空间或控制何时释放内存的能力?感谢。
答案 0 :(得分:8)
它工作正常,因为它是编译器允许的扩展名。它不是合法的C ++,我建议你避免它。为了帮助您避免它,我建议您使用-pedantic
进行编译以将非标准扩展的使用标记为警告,并-Werror
将警告视为错误。如果您不想将所有警告视为错误,请使用-pedantic-errors
,只需警告此类型。
但这并不意味着你应该使用指针和new
。您应该使用std::vector
。或者可能std::deque
或std::list
,但仅限于非常特殊的目的。对于大多数通用动态数组,std::vector
是选择。
答案 1 :(得分:3)
首先,您使用的不是标准C ++。可变长度数组是语言扩展,因此不可移植。其次,您可以通过使用在幕后为您执行此操作的类来避免显式使用动态分配的内存,从而自行处理内存管理。这种情况的明显例子是std::vector
:
std::vector<int> v;
for(int ii = 0; ii < n; ii++)
{
v.push_back(ii);
}
答案 2 :(得分:0)
在C ++中,数组用于静态存储。该大小仅在编译时已知。在编译期间将分配一个恒定大小的空间。
通常,编译器不允许动态创建数组。您编写的代码是C ++的扩展,它允许动态创建数组。我希望您改用std::vector
。
答案 3 :(得分:0)
编译时限制不仅适用于数组。