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

时间:2017-07-22 09:50:42

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

我有以下代码:

class Thing
{};

void fnc(Thing** out)
{
    *out = new Thing();
};

fnc通过输出参数返回Thing的新实例。通常我会按如下方式使用它:

int main()
{
    Thing* thing;
    fnc(&thing);  
}

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

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(???);
}

4 个答案:

答案 0 :(得分:5)

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

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

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(&uniqueThing);  
}

或使用pass-by-reference:

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

int main()
{
    std::unique_ptr<Thing> uniqueThing;
    fnc(uniqueThing);  
}

但我认为通过返回值返回指针会更清楚:

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

int main()
{
    auto uniqueThing = fnc();
}

答案 1 :(得分:2)

你不能直接这样做。您必须使用临时变量:

Thing* thing{};
fnc(&thing);

uniqueThing.reset(*thing);

甚至更好,因为fnc没有返回错误代码或其他内容,您只需返回新指针即可直接写入uniqueThing

std::unique_ptr<Thing> uniqueThing{fnc()};

答案 2 :(得分:2)

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

Thing* thing;
fnc(&thing);
std::unique_ptr<Thing> thing_unique (thing);

答案 3 :(得分:0)

您需要先从fnc获取指针,然后创建unique_ptr,例如:

Thing* tmp;
find(&tmp);
std::unique_ptr<Thing> thing(tmp);