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

标签 c++ arrays eclipse segmentation-fault openmp

我有一个程序需要一组 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];

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

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

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

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

关于c++ - 为什么 C++ 数组创建会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57850276/

相关文章:

c++ - 如何将类名的一部分定义为宏?

c++ - 除了使用 #define 进行条件编译之外,还有其他选择吗?

arrays - 用于将文件名放入数组中的快速迭代 webfolder

ios - 检查 NSMutableArray 是否包含给定值

java - 如何使用 Maven 在 Eclipse 中调试独立的 Java 程序?

java - 如何在 Windows Vista 命令提示符中检查端口 8080?

c++ - undistortPoints,findEssentialMat,recoverPose : What is the relation between their arguments?

c++ - 在 Windows 上的 Qt Creator 中编译 Cuda 代码

c - 数组在通过 void 函数后没有改变

java - 在 IntelliJ 中浏览自动完成选项时查看完整的 javadoc