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));
&*
是不是比get差很多?例如
do_something(&*b);
或
do_someting(b.get());
两者似乎都有效。
&*b
不一定等同于 b.get()
。为了确保收到指向托管对象的指针,您要使用 get()
。
有两个原因:
- 在不管理任何对象的
unique_ptr
上调用 operator*
是未定义的行为
T
类型的托管对象可能会重载 operator&
,因此您可能无法收到指向 T
. 的有效指针
标准定义了std::unique_ptr
的operator*
的行为:
typename add_lvalue_reference<T>::type operator*() const;
Requires: get() != nullptr
Returns: *get()
因此,如果 get()
returns nullptr
.
,则不允许应用 operator*
(来自 &*
)
您将获得托管对象中任何重载 operator&
的 return 值(如果存在)。这可以通过使用 std::addressof
来规避,但未定义的行为问题仍然存在。
std::unique_ptr<T>::get()
将为您提供托管对象的地址,如果没有托管对象,则为 nullptr
。使用 get()
更安全,而且结果可预测。
正如其他答案所指出的,如果 unique_ptr
不管理任何对象,则使用 &*
会导致未定义的行为。
对于unique_ptr
管理指针的情况,在大多数情况下,
do_something(&*b);
等同于
do_someting(b.get());
唯一可能得到不同结果的情况是 BLOB
有一个 operator&
重载,即 returns 一个不同于对象地址的指针。
这确实是一个基于意见的问题。
我碰巧认为 &*ptr
看起来很难看,reader 不清楚为什么要这样写。但它确实有一个优点,它可以与智能指针和常规指针一起使用。
operator*
of std::unique_ptr
has undefined behavior if no memory is owned by the unique_ptr
where as get()
会 return nullptr
.
如果 unique_ptr
可能为空我建议使用 get()
否则没有区别。
我正在使用 unique_ptr
来管理一些资源,以便在各种情况下安全销毁等
void do_something(BLOB* b);
unique_ptr<BLOB> b(new_BLOB(20));
&*
是不是比get差很多?例如
do_something(&*b);
或
do_someting(b.get());
两者似乎都有效。
&*b
不一定等同于 b.get()
。为了确保收到指向托管对象的指针,您要使用 get()
。
有两个原因:
- 在不管理任何对象的
unique_ptr
上调用operator*
是未定义的行为 T
类型的托管对象可能会重载operator&
,因此您可能无法收到指向T
. 的有效指针
标准定义了std::unique_ptr
的operator*
的行为:
typename add_lvalue_reference<T>::type operator*() const;
Requires:
get() != nullptr
Returns:
*get()
因此,如果 get()
returns nullptr
.
operator*
(来自 &*
)
您将获得托管对象中任何重载 operator&
的 return 值(如果存在)。这可以通过使用 std::addressof
来规避,但未定义的行为问题仍然存在。
std::unique_ptr<T>::get()
将为您提供托管对象的地址,如果没有托管对象,则为 nullptr
。使用 get()
更安全,而且结果可预测。
正如其他答案所指出的,如果 unique_ptr
不管理任何对象,则使用 &*
会导致未定义的行为。
对于unique_ptr
管理指针的情况,在大多数情况下,
do_something(&*b);
等同于
do_someting(b.get());
唯一可能得到不同结果的情况是 BLOB
有一个 operator&
重载,即 returns 一个不同于对象地址的指针。
这确实是一个基于意见的问题。
我碰巧认为 &*ptr
看起来很难看,reader 不清楚为什么要这样写。但它确实有一个优点,它可以与智能指针和常规指针一起使用。
operator*
of std::unique_ptr
has undefined behavior if no memory is owned by the unique_ptr
where as get()
会 return nullptr
.
如果 unique_ptr
可能为空我建议使用 get()
否则没有区别。