如果没有问题,您的代码应该工作;原始对象将在MyFunc
函数中创建,并且其所有权将被传回给调用者。但是,创建std::unique_ptr
的最佳方法是使用std::create_unique
(以避免干预错误条件时可能发生的泄漏)。您可以使用调试器或某个控制台输出来验证这是否正确发生;我的扩展代码(如下所示)的/修改产生以下输出,验证只有一个对象被创建,它是在的main
结束时)破坏:
Created
999
Destroyed
下面的代码:
#include <iostream>
#include <memory>
class MyObj
{
public:
MyObj(int v)
: value(v)
{
std::cout << "Created" << std::endl;
}
~MyObj()
{
std::cout << "Destroyed" << std::endl;
}
int value;
};
std::unique_ptr<MyObj> MyFunc()
{
auto ptr = std::make_unique<MyObj>(999);
// ...do other stuff here?...
// return std::move(ptr); // Loki Astari says move() is unnecessary
return ptr;
}
int main()
{
auto p = MyFunc();
std::cout << p->value << std::endl;
return 0;
}
当我返回std :: move(ptr)时,应该返回的类型是“unique_ptr”还是'&& unique_ptr '而不是?我以前从未见过后者,但似乎在移动语义中我们需要双引用? –
OneZero
分配一个唯一的ptr的最好方法可能是'std :: make_unique',但这与问题无关。 –
当你返回一个unique_ptr时,你不需要使用std :: move。上面的代码按照设计工作。 –