我在外部库中有一个预先存在的函数,看起来像这样;

bool CreateTheThing(MyThing *& pOut);

简而言之;我给它一个原始指针(通过引用),该函数分配内存并将我的指针分配给新分配的对象。函数返回时,完成后,我有责任释放内存。

显然,我想将此结果存储到unique_ptr<MyThing>中,并避免使用手动delete

我可以创建一个用于API调用的临时原始指针,并将其传递给unique_ptr的构造函数;
MyThing* tempPtr;
CreateTheThing(tempPtr);
unique_ptr<MyThing> realPtr = unique_ptr<MyThing>(tempPtr);

有没有比这更直接的方法?一种不需要临时的原始指针?理想情况下,将存在一种unique_ptr方法,该方法以可以直接与CreateTheThing方法一起使用的方式公开其内部指针?

据我所知,unique_ptr<T>::get()不允许这样做。它返回的指针不是内部使用的指针的引用。

最佳答案

通过一次编写多行代码,您可以保存一行代码(可能多次):

class Wrapper
{
  std::unique_ptr<MyThing> &u;
  MyThing *p;

public:
  Wrapper(std::unique_ptr<MyThing> &u) : u(u), p() {}

  operator MyThing* & ()
  { return p; }

  ~Wrapper()
  { u.reset(p); }
};

用法:
std::unique_ptr<MyThing> u;
CreateTheThing(Wrapper(u));

10-07 13:35