为什么我只能在C++中使用可变长度数组分配小于 10 mb 的内存?
Why can I only assign less than 10 mb using variable-lenght array in C++?
我知道可变长度数组(VLA(在技术上是不允许C++的。但是,除非您使用-pedantic
关键字,否则您不会收到警告。即便如此,您也只会收到警告。
虽然我没有找到这方面的具体参考,但我很确定VLAs
是在堆栈上分配的,而动态数组是在堆上分配的。
在调试一个接收通常小于 100 mb 的消息的函数时,我遇到了无法使用 gdb 访问数组中间的情况,而开头和结尾都可以。我意识到在堆栈上分配时,我可能会更快地遇到内存或地址空间限制。
为什么这段代码在如此少的字节数时会出现段错误?VLA 的大小是否有任何限制?为什么段错误发生在访问而不是分配上?为什么我可以使用 gdb 访问数组的末尾(在此示例代码中,在其他更大的程序中,我也可以访问开始(?
我用 clang 和 gcc 得到了相同的结果。
# include <iostream>
# include <vector>
using std::cout;
using std::endl;
void foo_a (int n) {
/* on stack */
cout << "a: (C), n = " << n << endl;
char buffer[n]; buffer[n] = ' ';
cout << (void*)buffer << endl;
for (int i = 0; i < n; i++) {
buffer[i] = (char) i;
}
}
void foo_b (int n) {
/* on heap */
cout << "b: (C++), n = " << n << endl;
char * buffer = new char[n];
for (int i = 0; i < n; i++) {
buffer[i] = (char) i;
}
cout << (void*)buffer << endl;
delete [] buffer;
}
int main (int, char**) {
int Ns[] = { 1024, 123123, 10586239 };
for (int n : Ns) {
foo_b (n);
foo_a (n);
}
return 0;
}
堆栈通常是固定大小。由于此大小是在创建线程时保留的,如果大小很大,因此在内存不足之前将无法创建非常多的线程。
堆栈设计用于临时数据的少量分配,应在堆上执行长期数据和大型分配。
通常,Linux上的堆栈大小约为8mb,Windows上的堆栈大小约为1mb。
您可以分配超过可用堆栈大小的分配,并且程序仅在尝试访问超出可用堆栈大小时崩溃。这取决于平台,例如在Windows上,一旦您分配的超过堆栈中容纳的内容,您就会收到堆栈溢出异常。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 为什么我只能在C++中使用可变长度数组分配小于 10 mb 的内存?
- malloc如何分配小于4KB的内存
- 如果RAM大小小于要求,则分配内存
- 为什么我可以分配一个长度小于数组本身的字符串文字