2013-04-24 94 views
0
main() 
{  
int *p; 

free(p); 
} 

此代碼在Win 2K中崩潰。但不知何故不會在Win XP中崩潰!任何想法爲什麼?C++代碼在Win 2000中崩潰但不會在Win xp中崩潰

編輯:是的。這是一個錯誤,不應該寫入。 更多信息:使用的編譯器是VC 6編譯器。在Win Xp機器上以發行模式編譯代碼。在具有Win Xp的多臺機器上使用此代碼運行可執行文件。代碼沒有導致任何崩潰。但在多臺Win 2K機器上運行相同的代碼。它每次都墜毀!

+1

您正在玩俄羅斯輪盤賭。你永遠不知道下一個鏡頭什麼時候會有真正的子彈。 – Mysticial 2013-04-24 09:21:16

+0

當然,這不是完整的代碼!? http://sscce.org/ – 2013-04-24 09:21:39

+0

我知道它的一個錯誤。我想知道的是,Win 2k的Win Xp在堆棧管理和類似的東西方面有多不同。如果是相反的話,我會很高興 - 在Win Xp上崩潰而不在Win 2K上。 – Alerter 2013-04-24 09:26:29

回答

6

這是未定義的行爲。它可能會崩潰,可能不會崩潰,甚至可能畫出獨角獸,但未定義行爲的行爲方式並沒有規定。

+0

在我工作的產品上有一個類似的代碼。它從未在Win Xp機器上崩潰。但是每次在Win 2K上相同的代碼都會崩潰!這是我感興趣的! :) – Alerter 2013-04-24 09:28:03

+0

@Alerter只是用NULL初始化它,一切都會好的。 – alexrider 2013-04-24 09:30:30

+0

@Alerter。這可能是僥倖......指針被分配爲寄存器或堆棧。編譯器沒有義務在它創建它時爲你清零指針...所以它已經創建,但是直到你專門用一個值或NULL初始化指針,它才能指向任何地方。所以如果它沒有崩潰,那就意味着a)你很幸運,指針的內容恰好是NULL,b)你很幸運,初始指針值指向一個允許你「釋放」的內存區域,可能會導致其他問題你rprogram – Jimbo 2013-04-24 09:31:25

1

您的代碼是未定義行爲:您正試圖使用​​(實際上是免費的)未初始化的指針。

既然這是UB,那麼嘗試和理解它爲什麼在一個操作系統上運行(或者看起來)是完全不相干的:UB的原理是「所有投注都關閉,任何事情都可能發生「。

0

這就是它的代碼嗎?也就是說,在初始化p之間沒有任何內容。

作爲一個猜測,我會說在你的XP系統上,編譯器正在將p初始化爲NULL(我不認爲它只是)。在2K系統上,編譯器只是將* p添加到堆棧,值可以是任何值。

Free(p)將正確處理NULL指針,但是如果您的2K系統在堆棧上創建指針時沒有將指針調零(我認爲C標準不需要),那麼它可能是dnagling ,因此free(p)可能試圖釋放一些任意的內存,導致你的問題。

如果你開始

int *p = NULL; 
free(p); 

這並不改變行爲?