我偶然发现了一个涉及大小不同的数组声明的测验。我想到的第一件事是,我需要通过new
命令使用动态分配,如下所示:
while(T--) {
int N;
cin >> N;
int *array = new int[N];
// Do something with 'array'
delete[] array;
}
但是,我看到一种解决方案允许以下情况:
while(T--) {
int N;
cin >> N;
int array[N];
// Do something with 'array'
}
经过一番研究,我了解到g ++允许这样做,但是这让我一直思考,那么在哪种情况下有必要使用动态分配?还是编译器将此转换为动态分配?
包括删除功能。但是请注意,这里的问题不是关于内存泄漏。
您显示的任何代码段都不是惯用的现代C ++代码。
new
和delete
(以及new[]
和delete[]
)在C ++中不被弃用,也永远不会被弃用。它们仍然是实例化动态分配对象的方法。但是,由于必须始终将new
与delete
(以及new[]
与delete[]
)进行匹配,因此最好将它们保存在(库)类中,以确保为您提供帮助。参见Why should C++ programmers minimize use of 'new'?。您的第一段代码使用“裸” new[]
,然后从不delete[]
使用创建的数组。那是个问题。 std::vector
在这里可以满足您的所有需求。它将在幕后使用某种形式的new
(我不会深入介绍实现细节),但是就您所需要的而言,它是一个动态数组,但更好,更安全。
您的第二个摘要使用“可变长度数组”(VLA),这是
某些
编译器还允许在C ++中作为扩展使用的C功能。与new
不同,VLA本质上是在堆栈上分配的(资源非常有限)。但更重要的是,它们不是标准的C ++功能,应避免使用,因为它们不可移植。它们当然不能代替动态(即堆)分配。new
/ delete
没有被弃用。delete