我可以将函数的输出参数存储到unique_ptr中吗?

Ign*_*ant 5 c++ unique-ptr c++11

我有以下代码:

class Thing
{};

void fnc(Thing** out)
{
    *out = new Thing();
};
Run Code Online (Sandbox Code Playgroud)

其中fnc返回Thingvia输出参数的新实例.通常我会按如下方式使用它:

int main()
{
    Thing* thing;
    fnc(&thing);  
}
Run Code Online (Sandbox Code Playgroud)

我可以将返回的对象放入其中std::unique_ptr吗?

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(???);
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

要扩展代码示例,它(即按指针传递)将是

void fnc(std::unique_ptr<Thing>* out)
{
    out->reset(new Thing());
};

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(&uniqueThing);  
}
Run Code Online (Sandbox Code Playgroud)

或使用传递引用:

void fnc(std::unique_ptr<Thing>& out)
{
    out.reset(new Thing());
};

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(uniqueThing);  
}
Run Code Online (Sandbox Code Playgroud)

但我觉得通过返回值返回指针会更清楚:

std::unique_ptr<Thing> fnc()
{
    return std::unique_ptr<Thing>(new Thing);
    // or
    // return std::make_unique<Thing>();
};

int main()
{
    auto uniqueThing = fnc();
}
Run Code Online (Sandbox Code Playgroud)


Som*_*ken 3

您应该将原始指针存储在 中,unique_ptr以便unique_ptr取得所有权:

Thing* thing;
fnc(&thing);
std::unique_ptr<Thing> thing_unique (thing);
Run Code Online (Sandbox Code Playgroud)