将大文件读入数组会导致崩溃

Reading a large file into an array causes a crash

本文关键字:崩溃 数组 文件      更新时间:2023-10-16

我有一个分配,我需要一个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您可以探索编译器的选项来增加堆栈大小,但这不是正确的解决方案