【问题标题】:what's the point of std::unique_ptr::getstd::unique_ptr::get 有什么意义
【发布时间】:2026-01-12 19:20:03
【问题描述】:

std::unique_ptr::get 不是首先破坏了拥有 unique_ptr 的目的吗? 我本来希望这个函数改变它的状态,所以它不再持有指针。 std::unique_ptr::get 有实际用处吗?

【问题讨论】:

  • 如果您想将指向对象的指针传递给库,例如任何操作系统调用,该怎么办?
  • 这是use case for get
  • 无论如何你都可以使用std::addressof(*p)。没有必要假装底层指针不在这里。

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


【解决方案1】:

std::unique_ptr 安全地提供独特的所有权语义。然而,这并不排除需要 non-owning 指针。 std::shared_ptr 有一个非拥有对应物std::weak_ptr。原始指针作为 std::unique_ptr 的非拥有对应物运行。

【讨论】:

  • 我认为这实际上应该是公认的答案。
【解决方案2】:

每次需要将原始指针传递给 C 函数时都会用到它:

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );

【讨论】:

  • 你也可以使用&amp;buffer[0],然后如果一些粗鲁的黑客将它改回原始指针,它仍然可以工作。
【解决方案3】:

我倾向于遵循的规则是:如果被调用者没有使用生命周期/所有权,则不要向其传递智能指针;而是传入原始 C++ 引用(首选)或原始指针。我发现将所有权问题与使用问题分开会更加简洁和灵活。

【讨论】:

    【解决方案4】:

    当你的双手被束缚并且你确实需要传递一个指向某个东西的指针时,p.get()&amp;*p 读起来更好。

    有一个函数可以改变状态,所以unique_ptr 不再持有一个指针,这个函数被命名为release。这对于将所有权转移到不提供从unique_ptr 直接构造的其他智能指针非常有用。任何其他用途都有泄露资源的风险。

    【讨论】:

    • 理论上有性能差异吗?我一直都这样做&*
    • @Carbon: &amp;* 理论上可能更快,因为它没有.get() 的可预测性保证,但随后它实际上更危险,因为it can lead to undefined behavior
    【解决方案5】:

    当您需要调用 C API 或设计不佳的 C++ API 时,这种情况很明显。

    【讨论】:

    • 如果 C++ API 强制您使用 特定 智能指针实现,为什么它会被“设计得很糟糕”?如果 API 本身不声明指针的所有权,更何况?
    • 对于“设计不佳”,也读为“旧的,从智能指针在标准库中/人们使用 Boost 之前的时间开始”。
    • @NicolBolas:如果该引用在调用结束时终止,我通常会传递 const 引用或对函数的引用。这使得调用代码略显笨拙,例如foo(*something),但我认为它比在那里使用指针更好,因为它可以更好地防止函数契约错误,同时不对指针类型施加约束。
    【解决方案6】:

    Herb Sutter 有一个很好的解释(大约 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE

    主要优点是唯一指针跟踪有多少其他对该指针的引用。仅在使用所有权时才使用唯一指针。当你想用那个指针对数据做一些事情时,你传递原始指针。

    【讨论】:

    • “主要优点是唯一指针跟踪有多少其他对该指针的引用”这适用于 shared_ptr,而不是 unique_ptr。
    • std::unique_ptr 不跟踪,指针有多少引用。它们是独一无二的,因此只有一个参考。如果您需要引用计数,std::shared_ptr 是您的最佳选择。
    最近更新 更多