这已经困扰我一段时间了。它涉及我(缺乏)对静态和动态内存分配之间差异的理解的核心。下面的数组是一个普通的静态数组,这应该意味着内存是在编译时分配的,对吗?然而,我已经将其设置为用户在运行时输入数组大小。
#include <iostream>
using namespace std;
int main() {
cout << "how many elements should the array hold? ";
int arraySize;
cin >> arraySize;
int arr[arraySize];
for (int i = 0; i < arraySize; ++i)
arr[i] = i * 2;
return 0;
}
请注意,没有new
or delete
该程序中的操作员。它在 Xcode 4.2(默认 Clang 编译器)以及我学校的 UNIX 服务器(GCC 4.4.5)中运行良好。编译器如何知道要分配多少内存arr
数组在编译时何时创建?这只是我的编译器的侥幸,可能会破坏其他内存的危险代码,还是合法的?
这是 C++ 编译器的非标准扩展。请注意,与 C++ 不同,在 C 中,自 C99 起就正式支持这一点(即标准规定的行为)。在 C++ 中,不支持它,因为已经有解决该问题的方法:使用std::vector
而不是数组。
然而数组并不是not使用静态内存分配(也不是动态内存分配),而是自动内存分配。自动变量在函数结束时自动释放(分配它们的内存区域称为堆栈,因为其上的分配和释放具有堆栈语义)。要让数组使用静态内存分配,您必须将static
在定义前面(但请注意,全局或命名空间范围中的变量始终使用静态内存分配)。但是,如果将变量设置为静态,您会发现编译器不允许再使用非常量数组大小。
注意std::vector
相反,使用动态内存分配来存储其数据。因此,即使对于静态,您也可以使用非常量大小std::vector
s.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)