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.
为什么这样做有效?
#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.