簡體   English   中英

unique_ptr :: get()而不是&*是什么?

[英]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_ptroperator*的bevaiour:

typename add_lvalue_reference<T>::type operator*() const;

  1. 需要: get() != nullptr

  2. 返回: *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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM