簡體   English   中英

將大文件讀入數組會導致崩潰

[英]Reading a large file into an array causes a crash

我有一項任務,我需要輸入一個7位數的輸入(電話號碼)並檢查它是否在pi的數字中找到。 pi的數字存儲在提供的空格分隔文本文件中。 看起來相當簡單:將輸入分解為數組,將pi的數字讀入數組,並檢查是否找到匹配項。 長話短說,我讓這個程序讓我滿意。 我們提供了文本文檔,其中pi的數字為10,100的倍數,依此類推,最多可達100萬個數字。 我的程序最多可達100,000個數字。 但無論出於何種原因,在100萬個數字文件中,它會因通用的Windows錯誤而崩潰。 我沒有關於它為什么崩潰並且沒有給出錯誤消息的信息(除了通用的“導致該程序停止工作的問題”消息)。

注意到賦值狀態的限制我不能使用任何面向對象的代碼,除了cin,cout和文件流對象(這個限制是因為我們還沒有進入類,他們不希望我們使用函數而不知道他們是如何工作的)。

無論如何,我正在尋找有關程序崩潰原因的見解。 我對需要它們的每個變量(包括計數器和函數返回)都使用了很長時間,這應該足夠了,因為它們可以達到大約20億,而且這里不應該有任何超過一百萬的數字。

謝謝你的幫助。 過去幾個小時我一直在這里沒有成功。

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

堆棧沒有足夠的空間來容納這么大的陣列。 堆棧是存儲自動變量 (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您可以探索編譯器的選項以增加堆棧大小,但這不是正確的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM