考虑这个程序:
#include <iostream>
using namespace std;
int main ()
{
int i;
cout << "How many numbers would you like to type? ";
cin >> i;
int * p;
p= new int[i];
cout << "Enter the numbers: \n";
for (int n=0; n<i; n++)
cin >> p[n];
cout << "You have entered: ";
for (int n=0; n<i; n++)
cout << p[n] << ", ";
delete[] p;
return 0;
}
和这一个:
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "How many numbers would you like to type? ";
cin >> num;
int arr[num];
cout << "Enter the numbers: \n";
for (int a = 0; a <num; ++a)
cin >>arr[a];
cout << "You have entered: ";
for (int a = 0; a <num; ++a)
cout <<arr[a]<< ", ";
return 0;
}
这两个项目都在完成同样的任务 - 对我来说 - 后者很多 比前者更容易理解。现在我的问题是为什么我们还需要动态内存分配?
答案 0 :(得分:1)
当num
不是编译器时间常量时,int arr[num];
是VLA(可变长度数组),而不是标准C ++。这是一些编译器提供的语言扩展(我假设您正在使用G ++)。
一些易于使用并且不需要您使用原始指针并处理手动动态分配的内容是std::vector
:
int i;
cout << "How many numbers would you like to type? ";
if (!(cin >> i)) { // error checking is important
cout << "Not a number, abort!\n";
return 1;
}
std::vector<int> numbers(i);
cout << "Enter the numbers: \n";
for (int a = 0; a < i; ++a)
cin >> numbers[a];
答案 1 :(得分:0)
如果你创建的这个数组需要经过它创建的函数的范围,请考虑会发生什么。例如,如果这不是main()
函数,而是一些返回记忆为主。或者您可能无法提前知道要创建多少个对象。例如,您可以基于动态实时数据维护基于树或基于图的数据结构。
在你提供的简单示例中,你是正确的:在堆上动态分配数组可能是一种浪费,并且如果做得不好就很容易导致内存泄漏等问题(虽然有很多方法,比如使用现代RAII技术进行所有分配)。但是,如果动态内存可用,则更复杂的场景会变得更加简单。