main()
{
int *p;
free(p);
}
此代碼在Win 2K中崩潰。但不知何故不會在Win XP中崩潰!任何想法爲什麼?C++代碼在Win 2000中崩潰但不會在Win xp中崩潰
編輯:是的。這是一個錯誤,不應該寫入。 更多信息:使用的編譯器是VC 6編譯器。在Win Xp機器上以發行模式編譯代碼。在具有Win Xp的多臺機器上使用此代碼運行可執行文件。代碼沒有導致任何崩潰。但在多臺Win 2K機器上運行相同的代碼。它每次都墜毀!
main()
{
int *p;
free(p);
}
此代碼在Win 2K中崩潰。但不知何故不會在Win XP中崩潰!任何想法爲什麼?C++代碼在Win 2000中崩潰但不會在Win xp中崩潰
編輯:是的。這是一個錯誤,不應該寫入。 更多信息:使用的編譯器是VC 6編譯器。在Win Xp機器上以發行模式編譯代碼。在具有Win Xp的多臺機器上使用此代碼運行可執行文件。代碼沒有導致任何崩潰。但在多臺Win 2K機器上運行相同的代碼。它每次都墜毀!
這是未定義的行爲。它可能會崩潰,可能不會崩潰,甚至可能畫出獨角獸,但未定義行爲的行爲方式並沒有規定。
在我工作的產品上有一個類似的代碼。它從未在Win Xp機器上崩潰。但是每次在Win 2K上相同的代碼都會崩潰!這是我感興趣的! :) – Alerter 2013-04-24 09:28:03
@Alerter只是用NULL初始化它,一切都會好的。 – alexrider 2013-04-24 09:30:30
@Alerter。這可能是僥倖......指針被分配爲寄存器或堆棧。編譯器沒有義務在它創建它時爲你清零指針...所以它已經創建,但是直到你專門用一個值或NULL初始化指針,它才能指向任何地方。所以如果它沒有崩潰,那就意味着a)你很幸運,指針的內容恰好是NULL,b)你很幸運,初始指針值指向一個允許你「釋放」的內存區域,可能會導致其他問題你rprogram – Jimbo 2013-04-24 09:31:25
您的代碼是未定義行爲:您正試圖使用(實際上是免費的)未初始化的指針。
既然這是UB,那麼嘗試和理解它爲什麼在一個操作系統上運行(或者看起來)是完全不相干的:UB的原理是「所有投注都關閉,任何事情都可能發生「。
這就是它的代碼嗎?也就是說,在初始化p之間沒有任何內容。
作爲一個猜測,我會說在你的XP系統上,編譯器正在將p初始化爲NULL(我不認爲它只是)。在2K系統上,編譯器只是將* p添加到堆棧,值可以是任何值。
Free(p)將正確處理NULL指針,但是如果您的2K系統在堆棧上創建指針時沒有將指針調零(我認爲C標準不需要),那麼它可能是dnagling ,因此free(p)可能試圖釋放一些任意的內存,導致你的問題。
如果你開始
int *p = NULL;
free(p);
這並不改變行爲?
您正在玩俄羅斯輪盤賭。你永遠不知道下一個鏡頭什麼時候會有真正的子彈。 – Mysticial 2013-04-24 09:21:16
當然,這不是完整的代碼!? http://sscce.org/ – 2013-04-24 09:21:39
我知道它的一個錯誤。我想知道的是,Win 2k的Win Xp在堆棧管理和類似的東西方面有多不同。如果是相反的話,我會很高興 - 在Win Xp上崩潰而不在Win 2K上。 – Alerter 2013-04-24 09:26:29