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

C++ 为什么C++;数组创建导致分段错误?,c++,arrays,eclipse,segmentation-fault,openmp,C++,Arrays,Eclipse,Segmentation Fault,Openmp,我有一个程序需要一组集合。对于较小的数组大小值,程序运行良好。当程序运行到较大的数组大小时,它将退出,退出代码为-1073741571 因此,我调试代码并查找它何时发生。下面是复制我的错误的最简单代码 #include <iostream> #include <cmath> #include <omp.h> #include <set> #include <vector> using namespace std; int main()

我有一个程序需要一组
集合
。对于较小的数组大小值,程序运行良好。当程序运行到较大的数组大小时,它将退出,退出代码为-1073741571

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

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

我真的不明白问题出在哪里。我试过寻找类似的问题,但还是不明白。我也试过运行它,效果很好。所以,我认为这可能与我的IDE eclipse有关。(不确定)

您是否使用OpenMP支持编译程序?OpenMP通过控制线程堆栈大小。系统上的默认值可能很小。
C
的(字节)大小相当大:.
sizeof(std::set)
在x86-64上是(或可以是)
48*43309=2078832
,就在您试图在堆栈上分配的2个MiB之下。这显然是堆栈溢出。不要在堆栈上分配兆字节的内容,这不是它的目的。@nanda因为
vector
为堆上的元素分配内存空间,而(非静态/自动本地)数组在堆栈上。堆栈的容量通常非常有限。
std::vector
本身只有48字节(特定于实现,在某些平台上可以多/少几个字节),存储在vector中的元素的内存从“堆”区域分配(使用
new/delete
进行动态分配)。所以如果你做
main。。。{std::vector x;/*在此处向x添加许多元素*/}
然后向量控制元数据位于“堆栈”区域,但添加到
x
的许多元素位于“堆”区域。通常,堆栈区域仅为几兆字节,因为它预期用于本地变量和调用堆栈,堆是“操作系统提供的”可用内存。您还可以将
C
移动到全局变量中,在
main
函数范围之外,这将在加载可执行时间时保留该内存空间,并在整个运行生命周期内进行修复。通常情况下,全局变量的使用会因此而受到反对(即使应用程序不再需要该变量,也会占用大量内存),难以进行单元测试,通常代码逻辑会变得复杂且难以推理,因为它取决于全局状态,而全局状态很容易从代码中的任何位置更改,变量大小在编译时是固定的,等等。。。但在某些情况下,这是一个选项。您是否使用OpenMP支持编译您的程序?OpenMP通过控制线程堆栈大小。系统上的默认值可能很小。
C
的(字节)大小相当大:.
sizeof(std::set)
在x86-64上是(或可以是)
48*43309=2078832
,就在您试图在堆栈上分配的2个MiB之下。这显然是堆栈溢出。不要在堆栈上分配兆字节的内容,这不是它的目的。@nanda因为
vector
为堆上的元素分配内存空间,而(非静态/自动本地)数组在堆栈上。堆栈的容量通常非常有限。
std::vector
本身只有48字节(特定于实现,在某些平台上可以多/少几个字节),存储在vector中的元素的内存从“堆”区域分配(使用
new/delete
进行动态分配)。所以如果你做
main。。。{std::vector x;/*在此处向x添加许多元素*/}
然后向量控制元数据位于“堆栈”区域,但添加到
x
的许多元素位于“堆”区域。通常,堆栈区域仅为几兆字节,因为它预期用于本地变量和调用堆栈,堆是“操作系统提供的”可用内存。您还可以将
C
移动到全局变量中,在
main
函数范围之外,这将在加载可执行时间时保留该内存空间,并在整个运行生命周期内进行修复。通常情况下,全局变量的使用会因此而受到反对(即使应用程序不再需要该变量,也会占用大量内存),难以进行单元测试,通常代码逻辑会变得复杂且难以推理,因为它取决于全局状态,而全局状态很容易从代码中的任何位置更改,变量大小在编译时是固定的,等等。。。但在某些情况下,这是一种选择。
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]
set<vector<bool>> C[43309];
auto C = vector<set<vector<bool>>>(43309);