2010-02-12 48 views
2

我在Delphi應用程序中聲明表:德爾福 - 應用程序未能正確初始化

x,y,z,r:array [1..10000000] of double; 
t1,t2,t3,t4:array [1..10000000] of integer; 

之前一切正常,但現在我在一些個錯誤提示(在大多數PC:■錯誤不來):

"The application failed to initialize properly (0xc0000005)" 

如果我改變的表,較小:

x,y,z,r:array [1..5000000] of double; 
t1,t2,t3,t4:array [1..5000000] of integer; 

錯誤消失

+0

本地或全局變量?如果是本地的話,增加你的堆棧大小。 – 2010-02-12 08:57:53

+1

將堆棧大小從默認的最大值1.048.576字節增加到480.000.000字節將無濟於事,因爲計算機沒有足夠的內存來開始。即使你有足夠的記憶,我也不認爲這是推薦的。 – 2010-02-12 12:48:18

回答

12

您的計算機內存不足。

  • 一個double需要8個字節。 4個10.000.000雙精度數組的初始化使用320.000.000字節。
  • 整數需要4個字節。 4個整數數組的初始化使用160.000.000字節。

在啓動時,您已經有效使用了480MB,不計其他任何東西。

反而在啓動時分配所有內存,應使用通用或專用容器當添加更多的項目可以自動增長的。

附帶一些容器想到

4

考慮使用動態數組,這樣你只需要它分配內存。

x,y,z,r:array of double; 
t1,t2,t3,t4:array of integer; 

將元素添加到數組:

SetLength(x, 1); 
x[0] := 0.0; 

雖然在previous question I asked我瞭解到,這是完全沒有必要的,我傾向於始終調用

Finalize(x); 

在結束,只是爲了確定。

+0

不要直接調用Finalize()。改用SetLength(...,0)。 – 2010-02-12 10:30:36

+0

雷米有什麼區別? – 2010-02-12 10:41:19

+0

通常情況下,'Finalize'使變量處於不確定狀態。如果程序注意到該變量在超出範圍時不是零,它會嘗試釋放該變量仍然引用的數組,導致崩潰。但它看起來像動態數組上的'Finalize'是一個特例。而不是去* System中的'Finalize'函數之一。pas *時,編譯器將調用轉換爲相當於將nil賦值給變量的代碼,這相當於將長度設置爲零,這反過來等於簡單地讓變量超出範圍。 – 2010-02-12 15:54:57