繁体   English   中英

为什么C ++数组创建会导致分段错误?

[英]Why does C++ array creation cause segmentation fault?

我有一个程序需要set<vector<bool>>数组。 对于较小的数组大小,该程序运行良好。 当程序运行到较大的数组大小时,它以退出代码-1073741571退出。

因此,我调试代码并查找何时发生。 下面是重现我的错误的最简单的代码。

#include <iostream>
#include <cmath>
#include <omp.h>
#include <set>
#include <vector>
using namespace std;
int main() {
    set<vector<bool>> C[43309];
}

小于43309的值不会引起错误。 我尝试调试,它显示

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007fff0d17ca99 in ntdll!memset () from C:\WINDOWS\SYSTEM32\ntdll.dll
[Thread 17616.0x3f64 exited with code 3221225725]
[Thread 17616.0x342c exited with code 3221225725]
[Inferior 1 (process 17616) exited with code 030000000375]

我真的不明白是什么问题。 我曾尝试搜索类似的问题,但仍然不明白。 我也尝试在ideone中运行它,效果很好。 因此,我认为这可能与我的IDE eclipse有关。 (不确定)

set<vector<bool>> C[43309];

在堆栈上分配std::set 43309副本。 在Windows上,默认堆栈大小通常为1MB。 从观察到的结果来看,实现的std::set可能每个使用大约24个字节,从而导致数组使用1,039,392字节,这比可用堆栈内存还多。

所有平台上的堆栈都很小,Mac和Linux通常具有8MB堆栈。 它们仅设计用于局部变量,函数参数,已保存的寄存器等的少量分配。应在堆上进行较大的分配。

最简单的方法是使用std::vector ,它为您管理堆分配:

auto C = vector<set<vector<bool>>>(43309);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM