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

Can I store a function's output parameter into a unique_ptr?

我有以下代码:

class Thing
{};

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

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

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

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

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

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

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

uniqueThing.reset(*thing);

甚至更好,因为 fnc 没有 return 错误代码或其他东西,你可以 return 新指针,让我们写初始化 uniqueThing直接:

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

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

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

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

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

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

或使用传递引用:

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

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

但我认为 return 指针 return 值会更清楚:

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

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

您需要先从 fnc 获取指针,然后创建 unique_ptr,类似于:

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