与unique_ptr :: get()而不是& *有什么关系?

时间:2015-10-30 17:24:13

标签: c++ pointers smart-pointers unique-ptr

我使用unique_ptr管理一些资源,以便在任何情况下安全销毁等等。

void do_something(BLOB* b);
unique_ptr<BLOB> b(new_BLOB(20));

&*比得到的更糟糕吗? e.g。

do_something(&*b);

do_someting(b.get());

两者似乎都有效。

4 个答案:

答案 0 :(得分:13)

如果unique_ptr没有内存,则operator*std::unique_ptr具有未定义的行为,get()将返回nullptr

如果unique_ptr可能为空,我建议使用get(),否则没有区别。

答案 1 :(得分:9)

&*b不一定等同于b.get()。为了确保收到指向托管对象的指针,您需要使用get()。 有两个原因:

  • operator*上调用unique_ptr不管理任何对象是未定义的行为
  • T类型的托管对象可能会重载operator&,因此您可能无法收到指向T的有效指针。

该标准定义了operator*的{​​{1}}的优势:

  

std::unique_ptr

     
      
  1. 需要:typename add_lvalue_reference<T>::type operator*() const;

  2.   
  3. 返回:get() != nullptr

  4.   

因此,如果*get()返回operator*,则不允许应用&*(来自get())。

如果存在,您将获得托管对象中任何重载nullptr的返回值。这可以通过使用operator&来规避,但未定义的行为问题仍然存在。

如果没有管理对象,

std::addressof将为您提供托管对象的地址或std::unique_ptr<T>::get()。使用nullptr更安全,并且您有可预测的结果。

答案 2 :(得分:3)

正如其他答案所指出的,如果unique_ptr没有管理任何对象,使用&*会导致未定义的行为。

对于unique_ptr管理指针的情况,在大多数情况下,

do_something(&*b);

相当于

do_someting(b.get());

唯一可以获得不同结果的是BLOBoperator&重载,返回的指针与对象的地址不同。

答案 3 :(得分:1)

这实际上是一个基于意见的问题。

我碰巧认为&*ptr看起来很难看,而且读者不清楚为什么会这样写。但它确实具有与智能指针和常规指针一起使用的优势。