2014-01-13 17 views
0

我的確在vs2012一些測試下面的代碼:凡(新INT *)指向

在調試模式:

int *b; int *a = b; // Crash!! 
int *b = *(new int*); int *a = b; //this is ok 

我很好奇,爲什麼是這樣的。 (new int *)默認指向一些真實的內存嗎? 由於它運行在非調試模式,,所以我不知道是否可以寫這樣的代碼

+1

這不好。 'new'創建的'int *'不被*初始化爲指向特定的內存位置。你正在看*未定義行爲*。 – BoBTFish

+8

第一個不應該崩潰 – cnicutar

+1

你需要更清楚地知道第一行'崩潰'的具體情況。 – atomice

回答

1

我很好奇爲什麼它是這樣的。

由於使用未初始化的對象的值,兩者都有未定義的行爲。雖然令人驚訝的是它會崩潰,但沒有理由認爲它會以某種不可預知的方式出錯。

解引用未初始化的指針(例如int a = *b;而不是int *a = b;)將更有可能導致崩潰。你確定你沒有這樣做嗎?

默認情況下(new int *)是否指向某些實際內存?

int**new int*返回。它指向的int*是未初始化的。

,如果它是確定寫這樣的代碼

這是從來沒有確定與不確定的行爲編寫代碼。即使它看起來「有效」,它會在最不經意的時候回來咬你。

+1

關於第一個例子,我找不到任何相關的參考文獻,它會使其成爲UB。我遇到的最接近的是4.1.1'如果glvalue引用的對象不是 類型爲T的對象,並且不是從T派生的類型的對象,或者對象未初始化,那麼必需的程序 此轉換具有未定義的行爲.'(conv.lval) - 來自n3242(C++ 11草案)。你是否建議'int * a = b'是一個左值轉換值?' – Abhijit

+0

@Abhijit:是的,沒錯。 'b'是_lvalue_,必須轉換爲_rvalue_才能使用它的值。 –

相關問題