如何處理我有一個帶有自定義洗掉器的唯一指標的場景,但第 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 變數?這是正確的方法,還是有更優雅的方法來處理這種情況?
先感謝您。
uj5u.com熱心網友回復:
我使用 .get() 將存盤的指標傳遞到 unique_ptr 中,但此函式獲取原始指標的所有權。
如果函式取得所有權,那么您應該從唯一指標釋放所有權。否則所有權將不是唯一的,并且由于多次呼叫洗掉器,您將獲得未定義的行為。這就是release成員函式的用途。
但是如果 ECDSA_SIG_set0 函式呼叫不成功會發生什么,我是否必須手動釋放 r 和 s 變數?
如果函式取得指標的所有權,則它負責洗掉它(直到它將所有權轉移到其他地方)。如果函式有時會泄露指標,那么它就是一個設計糟糕的 API。
該函式的作用應在其檔案中指定。std::unique_ptr如果它擁有所有權,那么在 API中使用會更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462798.html
