如何判断我是否在使用 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。