将大文件读入数组会导致崩溃
Reading a large file into an array causes a crash
我有一个分配,我需要一个7位数的输入(一个电话号码),并检查它是否在pi的数字中找到。圆周率的数字存储在提供的以空格分隔的文本文件中。这看起来相当简单:将输入分解成一个数组,将pi的数字读入一个数组,然后检查是否找到匹配项。长话短说,我对这个项目很满意。提供给我们的文本文档中包含圆周率的10、100等倍数,直至100万位数。我的程序能处理10万个数字。但不管出于什么原因,在100万数字的文件上,它崩溃了,出现了一个通用的windows错误。我没有关于为什么它崩溃的信息,也没有给出错误消息(除了通用的"一个问题导致这个程序停止工作"消息)。
注意到赋值状态的限制,我不能使用任何面向对象的代码,除了cin, cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们在不知道它们是如何工作的情况下使用函数)。
无论如何,我正在寻找程序崩溃的原因。我在每个需要它们的变量(包括计数器和函数返回)上使用长整型,这应该足够了,因为它们可以达到大约20亿,并且这里不应该有任何大于一百万的数字。
谢谢你的帮助。我在过去的几个小时里一直在做这个,但没有成功。
const long int numberOfDigits = 1000000;
int digitsOfPi[numberOfDigits];
int digitsOfPi[numberOfDigits];
堆栈没有足够的空间容纳这么大的数组。栈是存储自动变量(又名局部变量)的地方。当执行进入函数时,会自动为局部变量分配内存,并在函数返回时释放内存。由于这种自动内存管理,堆栈非常好,但有一个限制是它的大小有限。
大对象应该放在堆上。1堆是一个巨大的内存池,您可以随时动态地从中分配内存块。堆和堆栈的区别在于你负责分配和释放堆内存。它不会自动为您释放。
在c++中,要在堆上分配内存,使用new
操作符,每个new
都有相应的delete
,以便在不再需要时释放内存。(或者在我们的例子中,我们使用new[]
和delete[]
,因为我们正在处理一个数组。)
// Allocate memory on the heap.
int *digitsOfPi = new int[numberOfDigits];
// Use it.
// Then free it.
delete[] digitsOfPi;
// Or better yet, once you're allowed to use the STL...
std::vector<int> digitsOfPi;
更大的问题是,为什么你需要读取π立刻进入记忆。一个更好的设计,虽然编码更棘手,只需要固定的0(1)个内存量—例如,一次7个数字。
参见
- 堆栈和堆是什么,在哪里?
1您可以探索编译器的选项来增加堆栈大小,但这不是正确的解决方案
- 类对象数组的问题会导致崩溃
- 字节数组初始化会导致 DirectX 崩溃
- 使用 sf::Text 数组时崩溃
- For 循环在尝试读取数组 c++ 时程序崩溃
- 删除数组 c++ 崩溃问题
- 如果类的成员,C++数组会导致崩溃
- 在C++中删除指针数组时析构函数崩溃
- 在 C++ 中使用平展数组语法,崩溃取决于宽度/高度
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)
- 释放字符的动态数组时崩溃
- size_t结构非数组成员崩溃的强制转换
- C++程序在迭代到数组的最后一个元素时崩溃
- 从数组比较2个字符串时,程序崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 尝试获取数组中的最小元素时崩溃
- 动态数组在构造函数处崩溃
- 使用数组的单向链表:它在运行时崩溃
- C 程序崩溃(数组和2个指针Binsearch功能)