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

时间:2013-01-16 04:18:36

标签: c++

我有一项任务,我需要输入一个7位数的输入(电话号码)并检查它是否在pi的数字中找到。 pi的数字存储在提供的空格分隔文本文件中。看起来相当简单:将输入分解为数组,将pi的数字读入数组,并检查是否找到匹配项。长话短说,我让这个程序让我满意。我们提供了文本文档,其中pi的数字为10,100的倍数,依此类推,最多可达100万个数字。我的程序最多可达100,000个数字。但无论出于何种原因,在100万个数字文件中,它会因通用的Windows错误而崩溃。我没有关于它崩溃的原因以及没有给出错误消息的信息(除了通用的“导致该程序停止工作的问题”消息)。

注意到赋值状态的限制我不能使用任何面向对象的代码,除了cin,cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们使用功能,但不知道它们是如何工作的。)

无论如何,我正在寻找有关程序崩溃原因的见解。我在需要它们的每个变量(包括计数器和函数返回)上使用了很长时间,这应该足够了,因为它们可以达到大约20亿,而且这里不应该有超过一百万的任何数字。

感谢您的帮助。过去几个小时我一直在这里没有成功。

const long int numberOfDigits = 1000000;
int digitsOfPi[numberOfDigits];

1 个答案:

答案 0 :(得分:7)

int digitsOfPi[numberOfDigits];

堆栈没有足够的空间来容纳这么大的数组。堆栈是存储automatic variables(AKA局部变量)的地方。当执行进入函数时,内存将自动分配给局部变量,并在函数返回时释放。由于这种自动内存管理,堆栈很棒,但一个限制是它的大小有限。

大对象应该放在 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;

然而,更大的问题是你需要一次将π的所有数字读入内存。更好的设计虽然比较复杂,但只需要固定的O(1)内存量 - 比如一次7位数。

另见


1 您可以探索编译器的选项以增加堆栈大小,但这不是正确的解决方案。