如何传递unique_ptr<T>代替原始*输出*指针参数?
How to pass unique_ptr<T> in place of a raw *output* pointer parameter?
我在外部库中具有A 简而言之;我给它一个原始的指针(通过引用(,该功能分配内存并将我的指针分配给新分配的对象。当功能返回时,我完成记忆是我的责任。 显然,我想将此结果存储到 i 可以创建一个临时的原始指针,以与API调用一起使用,然后将其传递到 有比这更直接的方法吗?一个不需要临时的原始指针?理想情况下,将有一种 bool CreateTheThing(MyThing *& pOut);
unique_ptr<MyThing>
中,然后避免手册delete
。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));
有比这更直接的方法吗?一个不需要临时的原始指针?
不,没有。
理想情况下,将有一种唯一的_ptr方法,它可以直接与CreateThing方法合作,以揭示其内部指针?据我所知,
unique_ptr::get()
不允许这样做。
您的知识是正确的。这将破坏std::unique_ptr
的全部目的,因此unique_ptr::get()
是const
函数,指针由值返回。
但是,与您的构造函数相似,您可以随时使用std::unique_ptr::reset()
传递外部分配的指针。
另外,请注意:如果第三方API要求您使用free()
发布内存,则可能需要为std::unique_ptr
提供特殊的Deleter函数。
如果您经常使用该功能,则可以将转换放在函数中。
最好是更改API,但这也可以工作。
inline std::unique_ptr<MyThing> CreateTheThing()
{
MyThing* p;
if (CreateTheThing(p))
{
return std::unique_ptr<MyThing>(p);
}
return std::unique_ptr<MyThing>();
}
您还可以使此重载以使重构更加容易:
inline bool CreateTheThing(std::unique_ptr<MyThing>& ptr)
{
try
{
MyThing* p;
if (CreateTheThing(p))
ptr = std::unique_ptr<MyThing>(p);
else
return false;
}
catch (std::bad_alloc&)
{
return false;
}
return true;
}
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 如何传递unique_ptr<T>代替原始*输出*指针参数?
- 打开一个文件,修改每个字符,然后执行反向操作不输出原始文件
- TensorFlow模型:如何从原始爱好文件中识别输入/输出节点名称
- 在Raspberry Pi模拟输出上接收和播放原始PCM的ALSA配置
- popen( "ps -fu $USER" , "r" ) 不会给出所有原始输出结果限制为 81 个字符长
- 从文件输出原始字节时,第一个字节已损坏
- 检查原始文件的输出
- 输出原始数据扬声器