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

Posted

技术标签:

【中文标题】我可以将函数的输出参数存储到 unique_ptr 中吗?【英文标题】:Can I store a function's output parameter into a unique_ptr? 【发布时间】:2017-07-22 09:50:42 【问题描述】:

我有以下代码:

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(???);

【问题讨论】:

你需要一个间接,将原始指针传递给 unique_ptr。 为什么不从函数中返回一个指针? @molbdnilo 好点。现在让我们假设该函数返回一个状态码或类似的东西...... 【参考方案1】:

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

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);  

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

std::unique_ptr<Thing> fnc()

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

int main()

    auto uniqueThing = fnc();

【讨论】:

我喜欢直接输出指向 unique_ptr 的指针/引用的想法!【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

Thing* thing;
fnc(&thing);

uniqueThing.reset(*thing);

甚至更好,因为fnc 不返回错误代码或其他内容,您可以直接返回新指针,让我们直接编写初始化uniqueThing

std::unique_ptr<Thing> uniqueThingfnc();

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于我可以将函数的输出参数存储到 unique_ptr 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unique_ptr 对象作为参数传递给作为库的类

Pimpl with unique_ptr:为什么我必须将接口构造函数的定义移动到“.cpp”?

C++ 中指向 unique_ptr 函数参数的原始指针的目的是啥?

如何创建一个可以将 std::unique_ptr 作为模板参数正常工作的容器?

std::unique_ptr 作为参数在 std::thread 中起作用 [重复]

使用已使用 new X() 创建的变量将 std::unique_ptr 传递给函数