具有在参数中返回指针的函数的智能指针

Posted

技术标签:

【中文标题】具有在参数中返回指针的函数的智能指针【英文标题】:Smart pointers with functions returning a pointer in an argument 【发布时间】:2021-10-13 08:50:13 【问题描述】:

这个问题被讨论过几次,但所有这些讨论都已经有近十年的历史了,而且没有好的解决方案。问题是一样的。

我们有智能指针,比如unique_ptr,这很棒。我们有大量的 C 函数返回指向对象的指针作为参数,稍后需要释放。

假设这是函数:

int CreateSomething(OBJECT_TYPE** pObject);

那么,如果没有智能指针,我们通常会怎么做呢?显然是这样的:

OBJECT_TYPE* pObject;
if(CreateSomething(&pObject) == 0) 
    // Use the pObject pointer
    delete pObject;

现在,我想用智能指针重写它,我希望它像这样简单:

unique_ptr<OBJECT_TYPE> pObject;
if(CreateSomething(&pObject) == 0) 
    // Use the pObject pointer

从技术上讲,如果unique_ptrT** operator&amp;,并且如果它依赖这种工作流,那将是很有可能的,但事实并非如此。

如果我们想在这里使用智能指针,我们必须声明一个常规指针,在该函数中使用它,然后将它重新分配给智能指针。但是这些额外的步骤可以而且应该被消除,我希望也许已经有一个实现可以让我以我展示的那种简单的方式做我需要的事情。

是的,我可以编写自己的智能指针或调解器,这将简化 unique_ptr 的使用,但首先我想问一下,是否已经在标准库的深度中为此实现了一些东西,我只是忽略了它?

【问题讨论】:

pObject.get() 不会做你需要的吗?在这种情况下,它将返回OBJECT_TYPE**,因为T = OBJECT_TYPE* @Lala5th no, get() 在这种情况下不起作用。示例错误,应该使用unique_ptr&lt;OBJECT_TYPE&gt; 而不是unique_ptr&lt;OBJECT_TYPE*&gt; 【参考方案1】:

C++23 最近为这个用例添加了std::out_ptr

【讨论】:

【参考方案2】:

如果我们想在这里使用智能指针,我们必须声明一个常规指针,在该函数中使用它,然后将其重新分配给智能指针。

基本上,是的。这正是你必须做的(无论如何,现在直到std::out_ptr is added in C++23)。

C++ 智能指针根本不公开对其持有的指针的访问,因此您无法获取其地址以传递给 C 函数。所以,你必须使用智能指针的构造函数或赋值运算符,这需要对象指针首先已经被初始化。

我想问一下,标准库的深度是否已经为此实现了一些东西,而我只是忽略了它?

你没有忽略任何事情。

【讨论】:

【参考方案3】:

写一个包装器:(未编译的代码)

namespace smart_ptrs 
std::unique_ptr<OBJECT_TYPE> CreateSomething() 
    OBJECT_TYPE *p = nullptr;
    if (::CreateSomething(&p))
      return std::unique_ptr<OBJECT_TYPE>(p);
    return std::unique_ptr<OBJECT_TYPE>();

然后你可以写:

std::unique_ptr<OBJECT_TYPE> ptr = smart_ptrs::CreateSomething();
if (ptr) 
   // Use the pObject pointer
   

【讨论】:

OP 确实说过:“是的,我可以编写自己的智能指针或调解器,这将简化 unique_ptr 的使用,但首先我'我想问一下……”所以你实际上并没有回答真正被问到的问题。

以上是关于具有在参数中返回指针的函数的智能指针的主要内容,如果未能解决你的问题,请参考以下文章

工程实践:到底要不要使用智能指针

工程实践:到底要不要使用智能指针

智能指针总结

C++智能指针的模拟实现

C++智能指针的模拟实现

C++智能指针的模拟实现