我偶然发现了一个涉及大小不同的数组声明的测验。我想到的第一件事是,我需要在新命令中使用动态分配,如下所示:
while(T--){
int N;
cin >> N;
int *array = new int[N];
//do something with array
}
但是,我看到一种解决方案允许以下情况
while(T--){
int N;
cin >> N;
int array[N];
//do something with array
}
经过一番研究,我了解到g ++允许这样做,但我一直在想,那么在什么情况下使用动态分配是必要的?还是编译器将此转换为动态分配?
谢谢!
您的第二个示例使用variable length arrays,这是C99(not C ++!)功能,但是仍然是supported by g++。
另请参阅this答案。
可变长度数组与new
/ delete
不同,并且不以任何方式“弃用”它们。
再次注意,VLA是不是 ISO C ++。
嗯,对于初学者来说,new
/ delete
没有被弃用。
不过,根据您的具体情况,它们并不是唯一的解决方案。您选择什么取决于隐藏在“用数组执行操作”注释下的内容。
您的第二个示例使用了非标准的VLA扩展名,该扩展名试图将数组放入堆栈中。这有一定的局限性-即有限的大小以及阵列超出范围后无法使用此内存。您无法将其移出,它会在堆栈展开后“消失”。
因此,如果您的唯一目标是进行本地计算,然后丢弃数据,则实际上可以正常工作。但是,更可靠的方法是动态分配内存,最好使用std::vector
。