首页 > 解决方案 > 为什么 C++ 数组创建会导致分段错误?

问题描述

我有一个需要数组的程序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 有关。(没有把握)

标签: c++arrayseclipsesegmentation-faultopenmp

解决方案


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

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

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

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

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

推荐阅读