首頁  >  文章  >  後端開發  >  如何在 C 中安全地將 `unique_ptr` 向下轉換為 `unique_ptr` ?

如何在 C 中安全地將 `unique_ptr` 向下轉換為 `unique_ptr` ?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-21 19:30:16115瀏覽

How can I safely downcast a `unique_ptr` to a `unique_ptr` in C  ?

向下轉型unique_ptr; to unique_ptr

簡介:

簡介:透過釋放和重新分配進行轉換:

該問題提出了一種從$texttt{unique_ptr}$ 釋放對象,然後將原始指針轉換為所需的派生型別的方法。這種方法在概念上是有效的,但它有一個潛在的缺點:物件的生命週期暫時由原始指標管理,如果呼叫者隨後無法正確處理 $texttt{unique_ptr}$,則可能導致記憶體洩漏。

替代方案:靜態與動態唯一指標轉換:

為了解決這個問題,我們可以利用下列方法函數範本:
  • $texttt{static_unique_ptr_cast}$:執行靜態轉換,假設原始指標保證為所需的衍生型別。
  • $texttt{dynamic_unique_ptr_cast}$:執行動態轉換,使用 $texttt{dynamic_cast}$驗證轉換的

實作:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> static_unique_ptr_cast(std::unique_ptr<Base, Del>&& p)
{
    auto d = static_cast<Derived *>(p.release());
    return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
}

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast(std::unique_ptr<Base, Del>&& p)
{
    if (Derived *result = dynamic_cast<Derived *>(p.get())) {
        p.release();
        return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter()));
    }
    return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter());
}

用法:

的無意修改

以上是如何在 C 中安全地將 `unique_ptr` 向下轉換為 `unique_ptr` ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn