【发布时间】: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_ptr 有T** operator&,并且如果它依赖这种工作流,那将是很有可能的,但事实并非如此。
如果我们想在这里使用智能指针,我们必须声明一个常规指针,在该函数中使用它,然后将它重新分配给智能指针。但是这些额外的步骤可以而且应该被消除,我希望也许已经有一个实现可以让我以我展示的那种简单的方式做我需要的事情。
是的,我可以编写自己的智能指针或调解器,这将简化 unique_ptr 的使用,但首先我想问一下,是否已经在标准库的深度中为此实现了一些东西,我只是忽略了它?
【问题讨论】:
-
pObject.get()不会做你需要的吗?在这种情况下,它将返回OBJECT_TYPE**,因为T = OBJECT_TYPE* -
@Lala5th no,
get()在这种情况下不起作用。示例错误,应该使用unique_ptr<OBJECT_TYPE>而不是unique_ptr<OBJECT_TYPE*>
标签: c++ smart-pointers unique-ptr c++-standard-library standard-library