这里到底发生了什么?我以为你不能/应该复制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来避免这个问题中提出的问题。
这是应用程序中非常重要的性能区域,我担心这里可能会产生额外的开销。
答案 0 :(得分:3)
我以为你不能/应该复制unique_ptr的
确实你做不到。但是你可以移动它们,将托管对象的所有权从一个智能指针转移到另一个。
是否调用了unique_ptr的move方法?
是。如果可能,移动函数的返回值;并且临时返回值的分配也是通过移动来完成的。
有没有办法在函数内部实际创建
unique_ptr
并在函数范围退出时返回它而不会破坏对象?
是的,这正是这里发生的事情。移动unique_ptr
转移托管对象的所有权;所以在这里,所有权从返回表达式的临时值移动到返回值,转移到MySomeObject
。 (在实践中,第一步将被省略;但效果是相同的。)
这是应用程序中一个非常重要的性能区域,我担心这里可能会产生额外的开销。
移动unique_ptr
与复制原始指针的额外开销是:
这些中的任何一个都不太可能显着,特别是与new
的成本相比时。