我对动态内存分配有些困惑,我希望有人可以帮我清除它。
所以说我们有一个程序:
int length = 0;
cout << "Enter the size of the array" << endl;
cin >> length;
cin.ignore();
int numbers[length];
这还不是动态内存分配吗因为数组大小是在运行时定义的用户输入指定的长度后?
vs using:
int numQuestions = 0;
cout << "How many questions would you like to add?" << endl;
cin >> numQuestions;
cin.ignore();
Question *newQuestions = new Question[numQuestions];
有什么区别?动态内存分配在堆上,而数组分配在堆栈上。因为int numbers[length]
的内存是在堆栈上分配的,所以不将其视为动态内存分配。 更重要的是,您不能返回以这种方式分配的数组的指针,因为该数组是一个局部变量,在函数退出时会被销毁。
这就是动态分配的目的-动态分配允许内存在您需要的时间内持续使用,并且直到指向内存的指针上调用delete
时,内存才会消失。
此外,应该注意的是,声明一个在运行时确定大小的数组是非标准C ++,某些编译器将其作为扩展支持。
那么什么是最佳实践?使用原始指针是做事的老方法。这很容易出错,因为您可能会忘记删除内存,或者如果发生异常,则删除内存的代码可能会被绕过。这会导致内存泄漏。
如果使用std::vector
,则会获得以下好处:
vector
,我如何使用std::vector
非常简单!只需替换
int numbers[length];
与
std::vector<int> numbers(length);