我偶然发现了一个涉及大小不同的数组声明的测验。我想到的第一件事是,我需要在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 ++允许这样做,但它让我思考,那么在哪种情况下有必要使用动态分配?还是编译器将此转换为动态分配?
包括删除功能。但是请注意,这里的问题与内存泄漏无关。 问题来源于stack overflow
您显示的两个片段都不是惯用的现代C ++代码。
newand delete(and new[]和delete[])在C ++中不被弃用,也永远不会。它们仍然是实例化动态分配对象的方法。但是,由于您必须始终将a new与delete(以及a new[]与delete[])进行匹配,因此最好将它们保存在(库)类中,以确保为您提供帮助。请参阅C ++程序员为什么要尽量减少使用“ new”?。
您的第一个代码段使用“裸” new[],然后从不delete[]创建数组。那是个问题。std::vector在这里您需要的一切都很好。它将使用某种形式的new幕后花样(我将不深入介绍实现细节),但是您需要关心的是,它是一个动态数组,但更好,更安全。
第二个片段使用“可变长度数组”(VLA),这是一些编译器还允许在C ++中作为扩展使用的C功能。与newVLA 不同,VLA本质上是在堆栈上分配的(资源非常有限)。但更重要的是,它们不是标准的C ++功能,应避免使用,因为它们不可移植。它们当然不能代替动态(即堆)分配。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。