【发布时间】:2014-10-22 04:20:34
【问题描述】:
这里到底发生了什么?我认为您无法/不应该复制 unique_ptr,但是以下代码可以正常编译和运行:
std::unique_ptr<SomeObject> CreateObject()
{
return std::unique_ptr<SomeObject>(new SomeObject);
}
// Useage
auto MySomeObject = CreateObject();
是否调用了 unique_ptr 的 move 方法?如果是这样,有没有办法在函数内部实际创建 unique_ptr 并在函数范围退出时对象不会被破坏的情况下返回它?
我宁愿不返回实际指针,然后将其转换为 unique_ptr 以强制对该函数返回的对象使用 unique_ptrs。我也不想使用 shared_ptr 来避免这个问题中提出的问题。
这是应用程序的一个非常关键的性能区域,我担心这里可能会产生额外的开销。
【问题讨论】:
-
不是在复制
unique_ptr,而是在移动它。因此,在MySomeObject被销毁之前,该对象不会被销毁。另外,如果上面的内容产生任何开销,我会感到惊讶,因为 RVO 很可能会确保直接初始化MySomeObject而无需调用任何 move-ctor。 -
谢谢,这绝对让我放心。我希望您已将其作为答案发布,以便我接受。
-
之前有人问过这个问题,但我无法找到上一个实例。
-
更重要的是,我想说最后一段是 Wrong™。复制一个 unique_ptr 最多和移动一个一样慢。你应该担心的是,复制一个 unique_ptr 会导致语义中断,而不是慢代码。
-
CreateObject背后的概念是 C++14 的一部分,称为std::make_unique。
标签: c++ c++11 unique-ptr