我可以将函数的输出参数存储到 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);
我有以下代码:
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);