2013-12-08 86 views
0

我有一個創建與爲什麼我的動態分配數組被初始化爲0?

int *Array = new int[size]; 

動態分配的數組從我瞭解的一些代碼,數組應該是一個指向存儲陣列的第一個項目。當使用gdb時,我可以調用x Array來檢查第一個內存位置的值,x Array + 1檢查第二個值,等等。我期望有任何應用程序在我的內存中使用內存中的這些點時留下的垃圾值。但是,使用x Array將爲所有這些點返回0x00000000。我究竟做錯了什麼?我的代碼是否將數組的所有值初始化爲零?

編輯:爲了記錄在案,我問,因爲我的計劃是實現這一企圖:http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/。我想確保我的算法是不通過陣列遞增到每一個元素初始化爲0

+2

你不能依賴這種行爲,它是UB! –

+0

如果你想要保證這些零,你可以寫'int * Array = new int [size]();'(注意空尾括號)。 – fredoverflow

回答

3

在最現代的操作系統,操作系統給出零頁面應用程序,而不是讓不相關的進程之間的信息滲透。例如,這對於安全原因很重要。回到舊的DOS時代,事情更加隨意一些。今天,使用內存保護的操作系統,操作系統通常會給你零開始。

所以,如果這個new發生在你的程序的早期,你很可能會得到零。儘管如此,你依然會發瘋。這是未定義的行爲,如果你這樣做。

如果你繼續分配,填充和釋放內存,最終new將返回未歸零的內存。相反,它會包含你自己早期塗鴉的遺留物。

而且還有不能保證即使在程序開始時,任何特定的new調用都會​​返回填充零的內存。你只是可能看到你的程序早期致電new不要讓這個誤導你。

1

我希望有從任何應用程序留下的垃圾值是使用那些景點

這當然是可能的,但絕不是一種保障。特別是在調試版本中,如果您錯誤地使用內存,您可能會將運行時清零(或填充一些可識別的位模式),以幫助您調試內存。

而且,實際上,「虛擬地址」在給定虛擬地址的情況下是一個相當鬆散的術語。

重要的是,不,您的代碼是而不是將所有這些值設置爲零。

+0

在現代虛擬機操作系統中,如果讓我看到其他任務被丟棄的內存,我會感到非常失望,除非我做了比簡單的'新'更少的行人。 –

+0

@JoeZ期待它通過運行時(重新)分配... –

+0

@ g-makulik:我期望垃圾在同一個應用程序內;我只是在現代虛擬機操作系統中指出虛擬內存,您不應該期望看到_arbitrary other_應用程序中的垃圾。 (「那些景點」評論。) –

相關問題