如何判断我是否使用 VLA(可变长度数组)?

1 c++ 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;
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*dge 5

int *numberArray; numberArray = new int[size];不是一个可变长度数组,它是一个动态分配的数组。没关系。请注意,您必须delete[]在完成后执行此操作,您确实这样做了。

VLA 声明看起来像int numberArray[size];wheresize不是常数。当它超出范围时,它会自动释放,因此您不会使用delete它。它们通常在堆栈上分配,因此可以非常快速地创建和释放,但有各种缺陷。主要的一个是没有办法检查是否有足够的堆栈空间可用,如果没有,你的程序就会崩溃;没有办法安全地检测或处理该错误。因此,您必须非常小心地检查 的值是否size合理。

VLA 不是标准 C++ 的一部分,但有些编译器还是支持它们。

  • @LPVOID:如果您使用支持 VLA 扩展的编译器(例如 gcc 和 clang),则不会收到错误:https://godbolt.org/z/PazEj6q4P。如果老师说的是“可变长度数组”,而他们的意思是“向量”,那么他们会很困惑;“可变长度数组”在 C 中具有公认的含义,并且已延续到 C++ 中,并且我认为如果他们不厌其烦地使用该确切的短语,那么他们就是想要其确切的含义。 (3认同)

Ayx*_*xan 5

如果您想避免使用 VLA,请使用适当的编译器标志将 VLA 视为错误,这适用于-Werror=vlaGNUC(gcc、clang、icc 等)。无论如何,MSVC 不支持 VLA。