我有一个函数可以有效地实现这一点
void foo(Class** c)
{
// memory checks and stuff
(*c) = new Class();
// more stuff
}
我不能改变这个功能。 要调用这个函数,我必须这样做。
Class* c = nullptr;
foo(&c);
if (c)
{
// stuff
}
delete c;
我非常希望使用std::unique_ptr
而不是原始指针。 但是,我不知道如何获得内部指针的地址。 下面的清单显然无法编译,因为我试图获取rvalue的地址。
std::unique_ptr<Class> c = nullptr;
foo(&(c.get()));
if (c)
{
// stuff
}
我意识到我可以创建原始指针和唯一指针,调用函数,然后把原始指针给唯一指针,但我宁愿不这样做。 有办法做我想做的事吗?
创建foo
的包装器:
std::unique_ptr<Class> foo()
{
Class* c = nullptr;
foo(&c);
return std::unique_ptr<Class>(c);
}
你的手被函数的API束缚住了。
我个人认为最好的解决方案是做您所说的您不希望做的事情:在调用函数之后创建unique_ptr。
如果您经常调用这个函数,或者您有很多类似的函数,我将创建一个包装器函数,它在本地创建原始指针并返回UNIQUE_PTR。