[英]What's with unique_ptr::get() instead of &*?
我正在使用unique_ptr
管理一些資源,以便在任何情況下安全銷毀等。
void do_something(BLOB* b);
unique_ptr<BLOB> b(new_BLOB(20));
&*
比得到的更糟糕嗎? 例如
do_something(&*b);
要么
do_someting(b.get());
兩者似乎都有效。
該operator*
的std::unique_ptr
如果沒有內存所擁有的是未定義行為unique_ptr
,其中為get()
將返回nullptr
。
如果unique_ptr
可能為空,我建議使用get()
否則沒有區別。
&*b
不一定等於b.get()
。 為了確保收到指向托管對象的指針,您需要使用get()
。 有兩個原因:
unique_ptr
上調用operator*
而不管理任何對象是未定義的行為 T
的托管對象可能會重載operator&
,因此您可能無法接收到T
的有效指針。 該標准定義了std::unique_ptr
的operator*
的bevaiour:
typename add_lvalue_reference<T>::type operator*() const;
需要:
get() != nullptr
返回:
*get()
因此,如果get()
返回nullptr
則不允許應用operator*
(from &*
)。
您將獲得任何重載operator&
托管對象(如果存在)的返回值。 這可以通過使用std::addressof
來規避,但未定義的行為問題仍然存在。
std::unique_ptr<T>::get()
將為您提供托管對象的地址,如果沒有管理對象,則為nullptr
。 使用get()
更安全,並且您有可預測的結果。
正如其他答案所指出的,如果unique_ptr
不管理任何對象,則使用&*
會導致未定義的行為。
對於unique_ptr
管理指針的情況,在大多數情況下,
do_something(&*b);
相當於
do_someting(b.get());
唯一可以獲得不同結果的是BLOB
是否有一個operator&
重載,它返回一個與對象地址不同的指針。
這實際上是一個基於意見的問題。
我碰巧認為&*ptr
看起來很丑陋,並且讀者不清楚為什么會這樣寫。 但它確實具有與智能指針和常規指針一起使用的優勢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.