通过函数创建unique_ptr

时间:2014-08-28 10:26:50

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

这里到底发生了什么?我以为你不能/应该复制unique_ptr,但下面的代码编译并正常运行:

std::unique_ptr<SomeObject> CreateObject()
{
    return std::unique_ptr<SomeObject>(new SomeObject);
}

//  Useage
auto MySomeObject = CreateObject();

是否调用了unique_ptr的移动方法?如果是这样,有没有办法在函数内部实际创建unique_ptr并在函数范围退出时返回它而不会破坏对象?

我宁愿不返回实际指针,然后将其转换为unique_ptr,以强制使用unique_ptrs对此函数返回的对象。我也不想仅使用shared_ptr来避免这个问题中提出的问题。

这是应用程序中非常重要的性能区域,我担心这里可能会产生额外的开销。

1 个答案:

答案 0 :(得分:3)

  

我以为你不能/应该复制unique_ptr的

确实你做不到。但是你可以移动它们,将托管对象的所有权从一个智能指针转移到另一个。

  

是否调用了unique_ptr的move方法?

是。如果可能,移动函数的返回值;并且临时返回值的分配也是通过移动来完成的。

  

有没有办法在函数内部实际创建unique_ptr并在函数范围退出时返回它而不会破坏对象?

是的,这正是这里发生的事情。移动unique_ptr转移托管对象的所有权;所以在这里,所有权从返回表达式的临时值移动到返回值,转移到MySomeObject。 (在实践中,第一步将被省略;但效果是相同的。)

  

这是应用程序中一个非常重要的性能区域,我担心这里可能会产生额外的开销。

移动unique_ptr与复制原始指针的额外开销是:

  • 在指针移动时将其置零;
  • 检查指针被销毁时是否删除对象。

这些中的任何一个都不太可能显着,特别是与new的成本相比时。