C++中的动态内存分配?

4
这为什么有效?
    #include <iostream>    

    int main()
    {
        std::cout << "Enter a number: ";
        int arraySize;
        std::cin >> arraySize;

        int array[arraySize];

        for(int element : array)
        {
            element = 42;
            std::cout << element << "\n";
        }

        std::cout << "Array size: " << sizeof(array) << "\n";
        std::cout << "Element count: " << sizeof(array)/sizeof(int);

        return 0;
    }

我对C++中动态内存分配的理解告诉我,需要使用它的一种情况是在编译时不知道需要分配多少内存。在这个程序中,很明显数组大小在编译程序时是未知的,但是是动态的,因为它可以根据用户输入的值而改变。
下面是一个成功编译(无警告和错误)并运行的程序:
g++ program.cpp -std=c++11 -o program.exe

输入一个数字:12
42
42
42
42
42
42
42
42
42
42
42
42
数组大小:48
元素数量:12

如您所见,创建了一个包含用户定义数量元素的数组,每个元素都成功赋值为42,并且用sizeof()运算符证明存在。
为什么这不算作动态内存分配并且能够编译?

4
这并不是动态内存分配。这是你的编译器对C++语言的扩展。 - Sam Varshavchik
int array[arraySize]; -- 这不是有效的C++语法,因此它可能是“动态分配”,也可能不是。这取决于支持此语法的编译器供应商决定它是什么。 - PaulMcKenzie
为什么这个能正常工作? -- 不,它不能正常工作 - PaulMcKenzie
1
你没有打印出数组元素,只是一个变量你一直设置为相同的值。 - Galik
可能是本地变量长度数组的重复问题。 - Swift - Friday Pie
2个回答

4

这种变长数组(VLA)的声明方式并不符合标准:

int array[arraySize];

这行代码之所以可以通过g++编译,是因为编译器提供了这个功能作为扩展:

变长自动数组在ISO C99中是被允许的,在C90模式和C++中作为扩展,GCC也接受这些数组的声明。这些数组就像其他自动数组一样声明,但长度不是常量表达式。存储空间在声明点分配,并在包含该声明的块范围退出时释放。

3

在这一行中声明的变量称为 可变长度数组

int array[arraySize];

可变长度数组是C语言的一个特性,但它们实际上并不是C++的一部分。许多编译器支持可变长度数组作为编译器扩展(例如,这是gcc版本的可变长度数组文档),但不能保证在所有编译器上都能正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接