如何处理唯一指针存储的原始指针的所有权转移?
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
中使用它会好得多。
如何处理我有一个带有自定义删除器的唯一指针,但第 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
中使用它会好得多。