如何处理这样一个场景:我有一个带有自定义删除器的唯一指针,但是第三方库的函数需要一个原始指针,并且我用.get()传递在.get中存储的指针,但是这个函数拥有原始指针的所有权。
示例:
使用自定义删除器初始化唯一指针:
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唯一指针的所有权:
ECDSA_SIG_set0(ecDsaSignature.get(), r.get(), s.get())) 在范围的末尾,将调用自定义删除器,但由于r和s被移动,它会崩溃。我正在考虑使用原始指针,但是如果ECDSA_SIG_set0函数调用不成功,是否必须手动释放r和s变量呢?这是正确的方式,还是有更优雅的方法来处理这种情况?
提前谢谢你。
发布于 2022-04-13 13:53:48
--我用.get()传递unique_ptr中存储的指针,但是这个函数拥有原始指针的所有权。
如果函数获得所有权,则应该从唯一指针中释放所有权。否则,所有权将不是唯一的,您将得到未定义的行为,因为多次调用删除。这就是release成员函数的作用所在。
,但是如果ECDSA_SIG_set0函数调用不成功,是否必须手动释放r和s变量呢?
如果函数拥有指针的所有权,那么它负责删除指针(直到它将所有权转移到其他地方为止)。如果函数有时会泄漏指针,那么它就是一个设计糟糕的API。
函数所做的工作应在其文档中指定。如果std::unique_ptr具有所有权,那么在API中使用它会好得多。
https://stackoverflow.com/questions/71858556
复制相似问题