2014-01-16 55 views
0

在QT中,我遵循在頭文件中編寫接口的方式,然後在.cpp文件中執行。在我來說,我有一個MainApplication和兩個對話框作爲MainApplicationQT中的非初始化指針

所以在MainApplication頭的孩子,兩個未初始化指針兩個對話框

MemberForm *memberForm; 
AboutForm *aboutUsForm; 

據我知道指針會是null,並且此下列條件計算爲真

memberForm == NULL //False 
aboutUsForm == NULL //False 

據我知道,所有非初始化的指針是NULL指針,所以這是奇怪我。是什麼使得它更奇怪的是去除標頭中的指針之一,條件判斷爲真

MemberForm *memberForm; 
//AboutForm *aboutUsForm; // Removing the pointer 

條件計算真正

memberForm == NULL //True 

我明白任何迴應。 PS:如果你想downvote帖子請留下評論解釋爲什麼..

+1

你的第二個測試只是「運氣」,這些成員不會被初始化,你需要自己做。 – Mat

+2

在C++中,沒有明確的賦值,指針不會被初始化爲NULL/nullptr。缺省值是未定義的,並且在大多數情況下將指向未初始化的內存。在某些設置中,如使用MSVC進行調試構建,編譯器*可能會碰巧決定使用null初始化值,但這是您完全可以依賴的任何設置 - 它將在發佈版本中斷開。 –

+0

@Mat是的,我是一個幸運的男孩:D 它看起來,我必須學習更多.. –

回答

0

原始(「裸」)堆分配對象的指針成員不是初始化在C或C + +。它們的值是未定義的,並且在第一次初始化之前不能被依賴。無論你有什麼價值,你都是巧合而非設計。

通常情況下,在C++堆中分配給堆的對象的原始指針是一種在腳中拍攝自己的肯定的方式,並且往往是設計不好的標誌。將C的不安全方面拖到C++中確實沒有意義。你有C++的力量,用它來幫助你自己。

一個智能指針,如QScopedPointer,有更明智的行爲,你應該使用它。

  1. 你可以檢查它是否被初始化。

  2. 您不必擔心刪除指向的值。當智能指針被破壞時它會被自動刪除 - 當編譯器生成的析構函數代碼爲那個攜帶智能指針的類運行時。