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

How to handle the ownership transfer of a unique pointer's stored raw pointer?

如何处理我有一个带有自定义删除器的唯一指针,但第 3 方库的函数需要一个原始指针并且我使用 .get() 在 unique_ptr 中传递存储的指针的情况,但是此函数取得原始指针的所有权。

示例:

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

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 变量?这是正确的方法,还是有更优雅的方法来处理这种情况?

提前致谢。

I pass the stored pointer in the unique_ptr with .get(), but this function takes ownership of the raw pointer.

如果函数获得所有权,那么您应该释放唯一指针的所有权。否则所有权将不是唯一的,并且由于多次调用删除器,您将获得未定义的行为。这就是 release 成员函数的用途。

but what happens if the ECDSA_SIG_set0 function call is unsuccessful, do I have to manually free the r and s variables?

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

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