ホームページ > バックエンド開発 > C++ > C で「unique_ptr」を「unique_ptr」に安全にダウンキャストするにはどうすればよいですか?

C で「unique_ptr」を「unique_ptr」に安全にダウンキャストするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-21 19:30:16
オリジナル
205 人が閲覧しました

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

unique_ptr のダウンキャストunique_ptr

はじめに:

$texttt{C }$ プログラミングでは、$texttt を変換または「ダウンキャスト」する必要があるシナリオに遭遇することがあります。基本クラス $texttt{Base}$ の {unique_ptr}$ を派生クラス $texttt{Derived}$ の $texttt{unique_ptr}$。このプロセスには、所有権セマンティクスを維持しながら、$texttt{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());
}
ログイン後にコピー

使用法:

$texttt{static_unique_ptr_cast を使用します。 }$ 派生型が確実な場合。それ以外の場合は、$texttt{dynamic_unique_ptr_cast}$ を使用して、実行時に正しい型を確認します。これらの関数は右辺値参照を使用して、元の $texttt{unique_ptr}$.

への意図しない変更を防ぎます。

以上がC で「unique_ptr」を「unique_ptr」に安全にダウンキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート