c ++中的新增功能和删除功能已弃用吗?

问题描述 投票:0回答:2

我偶然发现了一个涉及大小不同的数组声明的测验。我想到的第一件事是,我需要在新命令中使用动态分配,如下所示:

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 ++允许这样做,但我一直在想,那么在什么情况下使用动态分配是必要的?还是编译器将此转换为动态分配?

谢谢!

c++ arrays dynamic-memory-allocation static-memory-allocation
2个回答
0
投票

您的第二个示例使用variable length arrays,这是C99(not C ++!)功能,但是仍然是supported by g++

另请参阅this答案。

可变长度数组与new / delete不同,并且不以任何方式“弃用”它们。

再次注意,VLA是不是 ISO C ++。


0
投票

嗯,对于初学者来说,new / delete没有被弃用。

不过,根据您的具体情况,它们并不是唯一的解决方案。您选择什么取决于隐藏在“用数组执行操作”注释下的内容。

您的第二个示例使用了非标准的VLA扩展名,该扩展名试图将数组放入堆栈中。这有一定的局限性-即有限的大小以及阵列超出范围后无法使用此内存。您无法将其移出,它会在堆栈展开后“消失”。

因此,如果您的唯一目标是进行本地计算,然后丢弃数据,则实际上可以正常工作。但是,更可靠的方法是动态分配内存,最好使用std::vector

© www.soinside.com 2019 - 2024. All rights reserved.