C++ C++;全局数组和非全局数组之间的差异(Stackoverflow异常)

C++ C++;全局数组和非全局数组之间的差异(Stackoverflow异常),c++,arrays,out-of-memory,stack-overflow,bitset,C++,Arrays,Out Of Memory,Stack Overflow,Bitset,当我编写以下程序时,它工作正常,即位集数组在main()方法之外声明 正常工作 #include <iostream> #include <bitset> using namespace std; bitset<5000> set[5000]; int main(){ cout<<"program runs fine"<<endl; return 0; } #包括 #包括 使用名称空间std; 位集[5000];

当我编写以下程序时,它工作正常,即位集数组在main()方法之外声明

正常工作

#include <iostream>
#include <bitset>

using namespace std;

bitset<5000> set[5000];

int main(){
    cout<<"program runs fine"<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
位集[5000];
int main(){

cout因为当您将数组声明为全局时,内存分配在进程的数据段中,而当您尝试在函数中声明数组时,内存分配在堆栈上。由于您分配了大量内存,因此会导致堆栈溢出异常


编辑:很好地解释了内存分配。

在main中声明它就是在“自动存储”即堆栈中声明它。在main之外声明它就是在“静态存储”即全局数据中声明它。您声明了大量数据。
std::bitset
在我的VS2013系统上是632字节(很可能是5000/8的对齐方式)。您正在声明其中的5000个。5000*632=3 160 000字节,或大约3兆字节。VS2013中堆栈的默认值为1兆字节,这就是您看到溢出的原因

有三种类型的存储:自动、存储和动态。通俗地说,它们分别称为堆栈、静态(在某些情况下为全局)和堆内存:

int static_int;

int main() {
  int automatic_int;
  static int local_static_int; // also static storage!
  int * dynamic_int_ptr = new int;
}
  • 自动存储是在编译时/运行时混合分配的。堆栈在运行时条目扩展到函数以保存局部变量,但这是一个已知的编译时值,因为变量的数量及其大小是众所周知的(我在这里忽略动态数组,因为它们是非标准的)这些变量在范围进入时构造,在范围退出时销毁
  • 静态存储是在编译时分配的。这个内存是预先支付的,并在程序启动时构造。当程序退出时,它被销毁
  • 动态存储在运行时分配。此内存由
    new
    分配,并返回一个指向某个blob的指针,该blob保存您闪亮的新数据。这些变量在调用
    new
    时构造,在调用
    delete
    时销毁

您正在尝试创建(5000*5000)/8字节-程序堆栈上有3兆字节的数据,导致报告的堆栈溢出。您的程序中没有足够的堆栈空间用于此操作。当您将其创建为全局时,它将插入到程序数据段中。

TL;DR;:通常情况下,“非全局数组”和对它们的引用可能超出范围,对任何访问都无效之后!!定义一个大的局部变量是获得堆栈溢出的好方法。对大变量使用动态分配。很抱歉,我没有明白你的意思。第二个程序甚至没有运行,但如果我将大小减小到50,那么它运行得很好,这与内存有关,但看起来这里涉及到不同类型的内存。我有他在这里,没有一个动态内存分配,所以没有堆。只是一个黑暗的镜头,我认为PaulR是正确的…谢谢,但是堆不是用于动态内存分配吗?所以像int *x= new int(10000)的东西将使用堆(不管它是内部还是外部C++函数)。。请让我知道我的推理是否正确。你的理解是正确的。当你使用像new这样的运算符时,内存将在堆上分配。在你的情况下,你将其声明为全局并不是在堆上分配内存ch是静态的,取决于您的程序。注意,我正在纠正这一点。所以基本上有三种类型的存储—堆栈、堆和静态存储/全局数据?我只听说了前两种。@VVV我用更多信息更新了我的答案!如果您需要进一步的澄清,请告诉我。我看到了Nilesh答案的链接,结果是E是5种类型的内存。刷新C++的时间已经在C世界中很长时间了。@ VVV的答案很好,但实际上非常平台化。C++不说任何关于代码>数据D<代码>和代码> BSS < /C>,它们是如何实现静态存储的解决方案。至于C++,只有3 K。存储的IND:自动、静态和动态。@SamCristall:我同意你的看法。根据平台的不同,进程中的段组织可能不同&实现静态存储的方式可能不同。谢谢,有三种类型的内存-堆栈、堆和静态存储/全局数据/数据段?谢谢链接。所以现在有5种类型的存储。谢谢。
int static_int;

int main() {
  int automatic_int;
  static int local_static_int; // also static storage!
  int * dynamic_int_ptr = new int;
}