【问题标题】:Passing std::unique_ptr to helper function将 std::unique_ptr 传递给辅助函数
【发布时间】:2013-01-16 15:36:38
【问题描述】:

这是正确的方法吗?

void helperFunc(MyClass *ptr)
{
    // do something with ptr,
}

unique_ptr<MyClass> p(new MyClass());
helperFunc(p.get());

或者我应该使用 shared_ptr 进行此类操作吗?

【问题讨论】:

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


    【解决方案1】:

    除非您想获得内存的所有权(在这种情况下,您应该传递 shared_ptrunique_ptr),否则为什么要使用指针?

    通过引用传递。

    void helperFunc(MyClass& obj)
    {
        // do something with ptr,
    }
    
    unique_ptr<MyClass> p(new MyClass());
    helperFunc(*p);
    

    在您不想获得所有权时使用原始指针通常很好,但在这里没有必要,除非您明确希望允许 nullptrs(在这种情况下,是的,使用原始指针)。

    【讨论】:

      【解决方案2】:

      如果 helpFunc 取得所有权,则您传递 std::shared_ptr 或 std::unique_ptr 否则只是通过引用传递:

        void helperFunc(MyClass& my_class)
        {
        }
      

      呼叫:

       helperFunc(*p);
      

      【讨论】:

      • 这很愚蠢。如果函数不想取得所有权为什么所有权是所有权(即unique_ptr)即使在界面中?采用非拥有引用的方法一直是采用 MyClass& 或 MyClass* 或 const 变体。 现在没有理由改变
      • 原始指针的唯一潜在问题是,如果您使用的应用程序混合了支持智能指针的库(并始终使用它们)和不使用它们的库(因为它们针对的是旧标准)。在这种情况下,您可能会发现自己拥有类似的原始指针函数,这些函数可能会或可能不会获得所有权。请参阅我在 unique_ptr usage 上的博客文章
      【解决方案3】:

      当您使用 get() 函数时,您会得到一个原始指针并丢失您使用 unique_ptr 类首先拥有的分配跟踪。

      我会避免使用get(),除非helperFunc 真的如此微不足道以至于它不拥有指针的所有权,并且可以保证不会泄漏它或在其他状态下留下悬空引用。

      如果您真的想将unique_ptr 本身传递给函数,请查看:How do I pass a unique_ptr argument to a constructor or a function?

      【讨论】:

      • 是的,我认为 helperFunc 不需要“完全”所有权......但这样我就可以为将来的一些麻烦敞开大门。
      • @fen:是的,这很可能给未来带来麻烦。
      猜你喜欢
      • 2015-09-03
      • 1970-01-01
      • 2012-03-30
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多