首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理唯一指针存储的原始指针的所有权转移?

如何处理唯一指针存储的原始指针的所有权转移?
EN

Stack Overflow用户
提问于 2022-04-13 13:43:14
回答 1查看 147关注 0票数 0

如何处理这样一个场景:我有一个带有自定义删除器的唯一指针,但是第三方库的函数需要一个原始指针,并且我用.get()传递在.get中存储的指针,但是这个函数拥有原始指针的所有权。

示例:

使用自定义删除器初始化唯一指针:

代码语言:javascript
复制
std::unique_ptr<BIGNUM, decltype(&BN_free)> r(BN_bin2bn(signature.data(), bnLen, nullptr), &BN_free);
std::unique_ptr<BIGNUM, decltype(&BN_free)> s(BN_bin2bn(signature.data() + bnLen, bnLen, nullptr), &BN_free);

将它们传递给ECDSA_SIG函数,该函数接受r和s唯一指针的所有权:

代码语言:javascript
复制
ECDSA_SIG_set0(ecDsaSignature.get(), r.get(), s.get())) 

在范围的末尾,将调用自定义删除器,但由于r和s被移动,它会崩溃。我正在考虑使用原始指针,但是如果ECDSA_SIG_set0函数调用不成功,是否必须手动释放r和s变量呢?这是正确的方式,还是有更优雅的方法来处理这种情况?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-13 13:53:48

--我用.get()传递unique_ptr中存储的指针,但是这个函数拥有原始指针的所有权。

如果函数获得所有权,则应该从唯一指针中释放所有权。否则,所有权将不是唯一的,您将得到未定义的行为,因为多次调用删除。这就是release成员函数的作用所在。

,但是如果ECDSA_SIG_set0函数调用不成功,是否必须手动释放r和s变量呢?

如果函数拥有指针的所有权,那么它负责删除指针(直到它将所有权转移到其他地方为止)。如果函数有时会泄漏指针,那么它就是一个设计糟糕的API。

函数所做的工作应在其文档中指定。如果std::unique_ptr具有所有权,那么在API中使用它会好得多。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71858556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档