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

Dynamic memory allocation in C++?

为什么这样做有效?

    #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() 运算符。

为什么这不算动态内存分配和编译?

您在此行中声明的变量称为可变长度数组:

int array[arraySize];

可变长度数组是 C 编程语言的一个特性,但它们实际上并不是 C++ 的一部分。许多编译器支持可变长度数组作为编译器扩展(这里是 the gcc version of variable-length arrays 的文档),但不能保证它适用于所有编译器。

可变长度数组 (VLA) 的声明不标准:

int array[arraySize];

这一行用 g++ 编译的原因是编译器提供了这个功能作为 extension:

Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++. These arrays are declared like any other automatic arrays, but with a length that is not a constant expression. The storage is allocated at the point of declaration and deallocated when the block scope containing the declaration exits.