2016-08-23 57 views
6

考慮下面的代碼:當auto_ptr未初始化時,get()是可靠的嗎?

std::auto_ptr<std::string> p; 

if (p.get() == 0) { 
    ... 
} 

是在get()成員函數用於檢查p尚未初始化的標準和可靠的方式?不管平臺,編譯器,編譯器的優化標誌等,它總會返回0嗎?

+4

在這個例子中,'auto_ptr'是* not *「未初始化」。默認構造函數將指針初始化爲空指針。 –

回答

1

auto_ptrget方法沒有前提條件。

也就是說,它始終是安全調用該方法,無論處於何種狀態auto_ptr對象是。

operator*成員函數,它確實有get() != 0的前提對比這一點。 C++標準爲條款中的成員函數指定了前提條件。如果一個函數沒有這樣的子句,那麼調用它總是安全的。

11

有沒有這樣的事情作爲聯合國未初始化std::auto_ptr,在default constructor指針初始化爲0

explicit auto_ptr(X* p = 0); 

因此get()將有效地返回 「0」 在默認構造std::auto_ptr

3

std::auto_ptr<std::string> p; 

電話the constructor

explicit auto_ptr (X* p=0) throw(); 

它初始化內部指針爲0

它依賴,因此,您可以通過 「尚未初始化」 的意思。調用默認構造函數,因爲你表現,將產生一個get也返回0它初始化到別的東西,然後到reset(0)一個電話,將產生一個get返回0。

+0

當使用多個平臺時,我可以依賴默認構造函數(而不必檢查每個實現)還是應該明確調用reset(0)以確保? – Marc

+1

不,不需要在默認ctor後明確調用'reset'。 –