2015-02-05 51 views
3

我們最近在軟件中發現了一個嚴重的錯誤,這個錯誤是由於假設一個動態分配的數組被初始化爲零(而不是)。所以,問題是這樣的:Windows XP是否自動將數組初始化爲零?

int* foo = new int[1]; 
foo[0] += 10; 

現在我想的估計,因爲最近我們也有我們的環境中進行一些更改這方面的影響:我們開始使用它運行不同的操作系統新的處理單元( Win XP之前,現在還在使用,現在除了一些運行Win 8的新單元外)。

在Win XP機器上運行的計算似乎沒有問題,但在Win 8上,相同的二進制文件會產生亂碼。所以編譯器不會初始化這些數組(這些都是經過優化的版本),但似乎Windows XP會將新分配的內存初始化爲零(而Windows 8不會)。這是有記錄的地方嗎?我能否相信這一點,以便我可以認爲這個問題不會影響以前在Win XP機器上執行的所有計算?

+0

你是否也開始使用新的IDE? – dmg 2015-02-05 14:12:57

+0

只需在每個這樣的分配末尾添加'()',以將數組歸零。應該不需要重新運行單元測試等等。依靠操作系統保證首先是充滿風險的,當你知道你必須支持一個你認識的平臺(Win 8)時,無論如何也不是一個前進的方向沒有這樣的保證。 – 2015-02-05 14:14:07

+0

你在什麼平臺上編譯你的程序? – cybermonkey 2015-02-05 14:14:31

回答

5

所有Windows版本都會發生新進程頁面的零初始化。否則就會導致安全失敗。但是,根據地址空間佈局,新的請求可能會或可能不會被循環分配滿足。而自Vista以來,地址空間是隨機的。

但確實有可能由於某些您不能控制的事件,即使在XP上,您也可能從new int[]獲得了回收內存頁面。這甚至可能是最初分配給您的進程的頁面,以響應您所做的一些操作系統調用,例如,在調用MessageBoxA()時將ANSI字符串轉換爲UTF-16。你真的不能認爲你所有的新記憶對你的過程來說都是新的。

+0

啊廢話......但非常感謝你! – Niko 2015-02-05 15:43:10