如何判断我是否在使用 VLA(可变长度阵列)?
How do I tell if I am using VLA (Variable Length Array)?
我在一个项目中,我们必须从文件中读入,将它们临时存储在动态分配的内存中,进行排序和填充,然后释放内存。
根据该项目正在测试我们对动态内存和内存泄漏的了解,其中一项说明是不要使用 VLA。
我不确定我们的讲师所说的我们不应该使用 VLA 是什么意思,我们是否不允许使用 [] 括号语法?或者我们可以使用它们,只要我们使用堆中的内存并在它们不再使用时正确地释放它们。
这是我的main.cpp,还没有完成,所以请原谅一些拼写错误和可能的错误,但如果您有任何建议或更正,我们也非常欢迎。
谢谢,祝大家周末愉快。
#include "proj2-arrayFunctions.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
ifstream file;
int size = 0;
int* numberArray;
int counter = 0;
file.open("arrays.txt");
if (!file)
{
cout << "error: file is not opened! " << endl;
return 1;
}
while(file.good())
{
file >> size;
numberArray = new int[size];
for (int i = 0; i < size; i++)
{
file >> numberArray[i];
}
bubbleSort(numberArray, size);
cout << "the largest value from this array is: " << largestValue(numberArray, size) << endl;
cout << "the smallest value from this array is: " << smallestValue(numberArray, size) << endl;
cout << "the average value of this array is: " << averageValue(numberArray, size) << endl;
cout << "the median value of this array is: " << medianValue(numberArray, size) << endl;
delete[] numberArray;
}
return 0;
}
int *numberArray; numberArray = new int[size];
不是 variable-length 数组,它是动态分配的数组。没关系。请注意,完成后您必须 delete[]
它,您会这样做。
VLA 声明看起来像 int numberArray[size];
,其中 size
不是常量。当它超出范围时它会自动释放,所以你不要在它上面使用 delete
。它们通常分配在堆栈上,因此可以非常快速地创建和释放,但存在各种缺陷。最主要的是无法检查是否有足够的堆栈 space 可用,如果没有,您的程序就会崩溃;没有办法安全地检测或处理该错误。因此,您必须非常小心地检查 size
的值是否合理。
VLA 不是标准 C++ 的一部分,但一些编译器无论如何都支持它们。
如果您想避免使用 VLA,请使用适当的编译器标志将 VLA 视为错误,对于 GNUC(gcc、clang、icc 等),这将是 -Werror=vla
。无论如何,MSVC 都不支持 VLA。
我在一个项目中,我们必须从文件中读入,将它们临时存储在动态分配的内存中,进行排序和填充,然后释放内存。
根据该项目正在测试我们对动态内存和内存泄漏的了解,其中一项说明是不要使用 VLA。
我不确定我们的讲师所说的我们不应该使用 VLA 是什么意思,我们是否不允许使用 [] 括号语法?或者我们可以使用它们,只要我们使用堆中的内存并在它们不再使用时正确地释放它们。
这是我的main.cpp,还没有完成,所以请原谅一些拼写错误和可能的错误,但如果您有任何建议或更正,我们也非常欢迎。
谢谢,祝大家周末愉快。
#include "proj2-arrayFunctions.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
ifstream file;
int size = 0;
int* numberArray;
int counter = 0;
file.open("arrays.txt");
if (!file)
{
cout << "error: file is not opened! " << endl;
return 1;
}
while(file.good())
{
file >> size;
numberArray = new int[size];
for (int i = 0; i < size; i++)
{
file >> numberArray[i];
}
bubbleSort(numberArray, size);
cout << "the largest value from this array is: " << largestValue(numberArray, size) << endl;
cout << "the smallest value from this array is: " << smallestValue(numberArray, size) << endl;
cout << "the average value of this array is: " << averageValue(numberArray, size) << endl;
cout << "the median value of this array is: " << medianValue(numberArray, size) << endl;
delete[] numberArray;
}
return 0;
}
int *numberArray; numberArray = new int[size];
不是 variable-length 数组,它是动态分配的数组。没关系。请注意,完成后您必须 delete[]
它,您会这样做。
VLA 声明看起来像 int numberArray[size];
,其中 size
不是常量。当它超出范围时它会自动释放,所以你不要在它上面使用 delete
。它们通常分配在堆栈上,因此可以非常快速地创建和释放,但存在各种缺陷。最主要的是无法检查是否有足够的堆栈 space 可用,如果没有,您的程序就会崩溃;没有办法安全地检测或处理该错误。因此,您必须非常小心地检查 size
的值是否合理。
VLA 不是标准 C++ 的一部分,但一些编译器无论如何都支持它们。
如果您想避免使用 VLA,请使用适当的编译器标志将 VLA 视为错误,对于 GNUC(gcc、clang、icc 等),这将是 -Werror=vla
。无论如何,MSVC 都不支持 VLA。