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

标签 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;
}

但是当我在 main 方法中创建它时,我得到了堆栈溢出异常。谁能详细解释这里发生了什么?通常我会在递归方法中看到堆栈溢出异常。那么谁在这里使用堆栈?

#include <iostream>
#include <bitset>

using namespace std;


int main(){
    bitset<5000> set[5000];
    cout<<"program runs fine"<<endl;
    return 0;
}

不起作用并抛出堆栈溢出异常 enter image description here

最佳答案

在 main 中声明它就是在“自动存储”也就是堆栈中声明它。在 main 之外声明它,就是在“静态存储”AKA 全局数据中声明它。您正在声明大量数据。 std::bitset<5000>在我的 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;
}
  • 自动存储在编译时/运行时混合分配。堆栈在运行时扩展到一个函数以保存局部变量,但这是一个已知的编译时值,因为变量的数量和它们的大小是众所周知的(我在这里忽略动态数组,因为它们是非-standard) 这些变量在范围进入时构造,并在范围退出时销毁。
  • 静态存储在编译时分配。此内存是预先支付的,并在程序启动时构建。它在程序退出时被破坏。
  • 动态存储在运行时分配。此内存由 new 分配并返回指向保存 Shiny 新数据的某个 blob 的指针。这些变量是在 new 时构造的被调用,并在 delete 时销毁被称为。

关于C++ 全局数组和非全局数组之间的区别(Stackoverflow 异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22492904/

相关文章:

c++ - 了解取消引用的类型 - const_iterator

c++ - 如何在 CppUnit 中漂亮地打印 STL 数据结构?

c++ - 将 char 数组转换为对象指针 - 这是 UB 吗?

sql - 给定两个数组如何获取不在两个数组中的项目?

python - Matplotlib 内存不足

c++ - std::variant 与 std::any 当类型可移动构造时

c++ - 动态分配数组和静态数组的区别

javascript - 从事件源创建对象

python - 有什么办法可以防止在循环中打开多个 gz 文件时出现 MemoryError 吗?

java - Spring Boot 项目中 Drools 规则引擎中的 GC 内存不足