class someClass
{
public:
int* ptr2Int;
};
這是一個有效的類(是的,它編譯)?假如在解引用它之前給ptr2Int賦值,那麼該類是否可以保證按照預期工作?有未初始化指針的類有未定義的行爲嗎?
class someClass
{
public:
int* ptr2Int;
};
這是一個有效的類(是的,它編譯)?假如在解引用它之前給ptr2Int賦值,那麼該類是否可以保證按照預期工作?有未初始化指針的類有未定義的行爲嗎?
類中的未初始化指針與獨立uninitailized指針沒有任何區別。只要你不以任何危險的方式使用指針,你就很好。
請記住,使用未初始化指針的「危險方式」僅僅是嘗試讀取其值(不需要取消引用)。如果在指針指定有效值之前使用這些隱式成員函數,則類中存在的隱式編譯器提供的複製構造函數和複製賦值運算符可能會執行此類嘗試。其實,如果我沒有弄錯,這個問題是標準化委員會層面討論的問題。是否允許隱式生成的成員函數跳過可能存在於非初始化類成員中的陷阱表示?我不記得是什麼結論。 (或者,也許我在C99的背景下看到了這種討論?)
爲什麼簡單地讀一個未初始化的指針'危險'? – Omnifarious 2010-08-06 18:18:56
@Omnifarious:因爲它可能包含所謂的*陷阱表示*,例如,它可能會使程序崩潰,僅僅嘗試讀取它。實際上,讀一個普通的未初始化的'int'可以產生相同的結果。但是用'int'它需要一個相當異乎尋常的平臺。有了指針,陷阱就更加真實了,因爲一些硬件平臺使用專用的*地址寄存器*來處理指針。這些寄存器可能會「實時」執行指針有效性檢查。即只是將值加載到寄存器中會導致陷阱。沒有必要的解除引用。 – AnT 2010-08-06 18:38:02
@Omnifarious:當然,較短的答案是:因爲語言規範明確指出,讀取* any *類型的未初始化值(「unsigned char」除外)通常會導致未定義的行爲。 – AnT 2010-08-06 18:40:25
是的,沒關係。指針本身存在,只是它的值是未知的,所以解引用它是不安全的。有一個未初始化的變量是非常好的,指針沒有任何不同
是的,這與帶有單個未初始化指針的struct
完全相同,並且兩者都保證工作得很好(只要您設置了指針在使用之前,當然是)。
直到你取消引用指針它都是好的,那麼它是未定義的領土。
某些編譯器會根據您在調試模式或發佈模式下進行編譯來設置指向默認值的指針(如null)。所以事情可以在一種模式下工作,突然之間一切都會崩潰。
讀取它的值也是UB – qdii 2014-11-05 11:48:54
您是否期望任何人提供保證,即代碼會像人們預期的那樣行事,不知道人們會期待什麼? :) – 2010-08-06 17:37:27