【问题标题】:What is the difference between *smart_ptr and *smart_ptr.get()*smart_ptr 和 *smart_ptr.get() 有什么区别
【发布时间】:2020-10-13 21:18:10
【问题描述】:

据我所知,取消引用 - *smart_ptrget() + 取消引用 *smart_ptr.get() 使用智能指针做同样的事情,但可能有一些我不知道的东西,原因我已经看到很多使用第二种方法的案例,那有什么意义呢?它会以任何方式影响性能吗?

【问题讨论】:

  • 没有区别(除了一个比另一个长6个字符)。所有标准智能指针类型都重载operator*,这会取消引用包含的指针,与取消引用.get() 的结果相同。

标签: c++ c++11 std shared-ptr smart-pointers


【解决方案1】:

没有区别。 [unique.ptr.single.observers][util.smartptr.shared.obs] 中的标准都将 operator* 定义为 *get()


get 应该在您需要指向托管对象的原始指针以传递给仅包含原始指针的内容时使用。否则,*-> 将被重载,以便智能指针将这些操作应用于托管指针。


您可能很想使用&*smart_ptr 来获取指向托管对象的原始指针,但& 是一个可以重载的运算符,可能会给您错误的结果。获取地址(指针)的正确方法是std::addressof(*smart_ptr),但使用smart_ptr.get() 更短。

【讨论】:

    【解决方案2】:

    从功能的角度来看,*smart_ptr*(smart_ptr.get()) 之间没有区别,因为它们在 C++ 标准中被定义为做同样的事情 - 取消引用持有的指针并返回对被指向对象的引用。

    但是,从调试的角度来看,可能存在细微差别,具体取决于实现。 get() 定义为按原样返回持有的指针,无论它是否为nullptr。智能指针不知道调用者之后将使用该指针做什么。但是,取消引用 nullptr未定义的行为,并且知道,智能指针实现可能决定将其 @ 987654327@ 如果无法取消引用所持有的指针,则会引发运行时错误,以帮助进行调试。

    这在 cppreference 中有所提及,至少对于 std::unique_ptr::operator*

    可能抛出,例如如果pointer 定义了一个投掷operator*

    【讨论】:

    • 请注意get()不返回T*,而是pointer,这可能是unique_ptr<T, Deleter>Deleter类型中指定的一些自定义类型。 cppreference 中的注释是说*uptr 可以抛出,因为*get() 可以抛出,因为p 可以是自定义类型pointer 而不是T*。换句话说,没有区别,甚至没有细微的区别,不取决于实现。
    • @Justin 你所说的关于get() 返回pointer 是真的。但是如果pointer 只是一个原始的T*,那么*get() 无法在运行时验证指针,但smart_ptr::operator* 可能仍然可以,这取决于实现 是否决定使用当pointer 是原始T* 时的这种逻辑,当pointer 是另一种具有自己的operator* 时忽略这种逻辑。所以,我坚持我的答案。
    • 我明白你的意思。 *NULL 是未定义的行为,因此库可以添加空检查以进行调试。有趣的。我怀疑没有人会因为-fno-exceptions 而抛出异常,但他们可能有assert(...) 或类似的东西
    • @Justin 例如,众所周知,Microsoft 会在其库的调试版本中添加调试断言和异常,即使标准没有说需要这样做。
    猜你喜欢
    • 2012-06-22
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多