如何传递unique_ptr <t>代替raw * output *指针参数?

时间:2017-06-28 12:37:25

标签: c++ c++11 unique-ptr

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

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()不允许这样做。它返回的指针不是对内部使用指针的引用。

3 个答案:

答案 0 :(得分:9)

  

有比这更直接的方法吗?一个不需要临时原始指针的?

不,没有。

  

理想情况下,会有一个unique_ptr方法以一种可以直接使用CreateTheThing方法的方式公开其内部指针?据我所知,CmsSolrQuery squery = new CmsSolrQuery(null, CmsRequestUtil.createParameterMap(query)); CmsSolrResultList results = index.search(cmso, squery,true); SolrQuery sorlquery = results.getQuery(); String cursor = sorlquery.get("cursorMark"); SolrClient client = new HttpSolrClient("http://localhost:9090/opencms/handleSolrSelect"); QueryResponse resp = client.query(sorlquery); String nextCursor = resp.getNextCursorMark(); 不允许这样做。

你的知识是正确的。这会破坏unique_ptr::get()的整个目的,因此std::unique_ptr是一个unique_ptr::get()函数,指针按值返回。

但是与构造函数示例类似,您始终可以使用const传递外部分配的指针。

另请注意:如果第三方API要求您使用std::unique_ptr::reset()释放内存,则可能需要为free()提供特殊的删除功能。

答案 1 :(得分:9)

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

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

答案 2 :(得分:3)

如果你经常使用这个功能,你可以将转换放在一个函数中。

最好是更改API,但这也可以。

inline std::unique_ptr<MyThing> CreateTheThing()
{
  MyThing* p;
  if (CreateTheThing(p))
  {
    return std::unique_ptr<MyThing>(p);
  }
  return std::unique_ptr<MyThing>();
}