在C ++中,'new'和'delete'是否已弃用?

问题描述 投票:7回答:4

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

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++ arrays dynamic-memory-allocation static-memory-allocation
4个回答
12
投票

您显示的任何代码段都不是惯用的现代C ++代码。

newdelete(以及new[]delete[])在C ++中不被弃用,也永远不会被弃用。它们仍然是实例化动态分配对象的方法。但是,由于必须始终将newdelete(以及new[]delete[])进行匹配,因此最好将它们保存在(库)类中,以确保为您提供帮助。参见Why should C++ programmers minimize use of 'new'?您的第一段代码使用“裸” new[],然后从不delete[]使用创建的数组。那是个问题。 std::vector在这里可以满足您的所有需求。它将在幕后使用某种形式的new(我不会深入介绍实现细节),但是就您所需要的而言,它是一个动态数组,但更好,更安全。

您的第二个摘要使用“可变长度数组”(VLA),这是

某些

编译器还允许在C ++中作为扩展使用的C功能。与new不同,VLA本质上是在堆栈上分配的(资源非常有限)。但更重要的是,它们不是标准的C ++功能,应避免使用,因为它们不可移植。它们当然不能代替动态(即堆)分配。

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

1
投票
您的第二个示例使用variable length arrays(VLA),这是C99

not


0
投票
第一个示例最后需要一个

delete

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