2016-10-20 46 views
3

爲什麼我會用get()*,而不是僅僅調用*使用auto_ptr時,* ptr和* ptr.get()之間有什麼區別?

考慮下面的代碼:

auto_ptr<int> p (new int); 
*p = 100; 
cout << "p points to " << *p << '\n';   //100 

auto_ptr<int> p (new int); 
*p.get() = 100; 
cout << "p points to " << *p.get() << '\n'; //100 

結果是完全一樣的。 get()更安全嗎?

+3

幾乎沒有區別。 – Nawaz

+7

因爲它被標記爲C++ 11:'std :: auto_ptr'已被棄用,並將在C++ 17中被刪除。改爲使用'std :: unique_ptr'。 –

+2

「是()更安全嗎?」在我看來,使用'auto_ptr'會讓你的整個代碼不安全。不要使用它。 –

回答

6

實際上沒有區別。

*p情況下,過載operator*(由auto_ptr定義)被調用它返回參考到底層對象(解除引用它—這是由成員函數完成後)。然而,在後一種情況下,p.get()返回您自己解除引用的基礎指針。

我希望能回答你的問題。現在我建議你避免使用std::auto_ptr,因爲它設計不好—它甚至已被棄用,優先於其他智能指針,如std::unique_ptrstd::shared_ptr(連同std::weak_ptr)。

4

沒有有效的區別。 operator*定義爲返回*get()cppreference)。

您應該考慮在auto_ptr中使用unique_ptr。後者已經從當前的C++標準中刪除,並具有非直觀的拷貝行爲。

5

*p調用auto_ptr::operator*,它取消引用託管指針。

*p.get*p.get首先調用方法auto_ptr::get,它返回託管指針,然後由操作員*取消引用。

這些將在執行完成後提供完全相同的結果:託管指針被解除引用,並且在使用get時不會有額外的檢查。

請注意auto_ptr自C++ 11以來已棄用。複印時,這是危險的,因爲指針的所有權轉移:

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 
} // copy_of_p is destroyed, and deletes its owned pointer 

// p is now a dangling pointer 

爲了避免這個問題,你不得不「管理管理指針」:

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 

    // ... 

    p = copy_of_p; // p gets back ownership 
} // copy_of_p is destroyed, but doesn't delete pointer owned by p 

// p is still valid 

使用unique_ptrshared_ptr代替。

0

不要在智能指針上使用get()(不管auto_,unique_,shared_或其他)。這將返回一個不受RAII類控制的裸指針。這樣可以將指向另一個RAII類的指針(稍後會導致雙重刪除)或者調用者執行一些愚蠢的操作,如刪除指針(再次導致雙重刪除)。只需解除智能指針的引用即可。

PS:僅限專家:是的,從智能指針中提取原始指針還有其他正當理由。但由於一般不使用get(),所以它被使用的時間成爲「這裏有些奇怪的事情正在發生,請注意!」的紅旗。

相關問題