c++ - 为什么 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 有关。(没有把握)
解决方案
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);
推荐阅读
- cmake - Find_library 使用不同版本的 cmake 失败
- java - Java继承与实现
- c - C99 递归矩阵乘法。如何访问索引?
- c# - 如何根据断言方法结果 webdriver C# 通过或失败测试?
- javascript - 使用 vanilla javascript 在引导模型中显示来自输入和选择字段的信息
- mysql - 数据过多时元查询不返回任何内容
- c# - 在 SpecFlow 3 生命周期挂钩中使用 SimpleInjector 范围
- ios - 打开 Gmail/SuperHuman 消息的链接
- javascript - Phaser 3:将游戏缩放到完整的网站宽度和高度
- ftp - 仅使用 wget 下载文本文件