2015-10-06 54 views
1

如果我有一個類Rectangle爲什麼不訪問未初始化的指針顯示沒有錯誤?

class Rectangle{ 

private: 
    double width; 
    double height; 


    public: 
     void Set(double w , double l){ 
      width = w; 
      height = l; 
     } 
}; 

和我decleare一個物體,例如:

Rectangle *Obj; 

,然後使用設定功能爲

Obj->Set(6.0, 9.0); 

程序運行並顯示沒有錯誤,而根據我應該顯示錯誤,因爲我還沒有初始化指針。

+2

C++在運行時不會跟蹤指針是否被初始化。如果設置了足夠高的警告級別,編譯器可能會提示您使用未初始化的變量。 –

+1

不是。具體來說,如何處理未初始化的指針是由實現決定的。通常這個指針只包含堆棧中碰到的任何垃圾,如果它沒有指向任何致命的地方,那麼你很好。除非你不是。有些東西剛剛被粉碎,直到後來才發現。 – user4581301

回答

1

我剛剛在Visual Studio中編譯了這個,我得到了下面的錯誤。可能你選擇的編譯器沒有這些檢查嗎?你使用的是什麼編譯器?

error C4700: uninitialized local variable 'Obj' used 
+0

g ++版本應該是'警告:'Obj'在這個函數中未初始化使用的東西[-Wuninitialized]' – user4581301

+0

我選擇了turbo c –

4

使用未初始化的指針是未定義的行爲。這意味着執行可以做任何想做的事情什麼都不做

行爲只是未定義。

1

訪問未初始化指針的值(更不用說對其進行解引用)會導致未定義的行爲。

未定義行爲的本質是任何結果都是允許的,但沒有特別要求。 「any」這個單詞的範圍很廣......發出錯誤信息是正確的。不發出錯誤消息是正確的。重新格式化硬盤驅動器並安裝不同的操作系統是正確的(雖然在實踐中不太可能)。