Heim > Backend-Entwicklung > C++ > Wie kann ich in C einen „unique_ptr' sicher in einen „unique_ptr' umwandeln?

Wie kann ich in C einen „unique_ptr' sicher in einen „unique_ptr' umwandeln?

Mary-Kate Olsen
Freigeben: 2024-11-21 19:30:16
Original
181 Leute haben es durchsucht

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

Downcasting unique_ptr zu unique_ptr

Einführung:

Bei der $texttt{C }$-Programmierung können wir auf Szenarien stoßen, in denen wir einen $texttt konvertieren oder „downcasten“ müssen {unique_ptr}$ einer Basisklasse $texttt{Base}$ zu einem $texttt{unique_ptr}$ von eine abgeleitete Klasse $texttt{Derived}$. Dieser Prozess beinhaltet die Umwandlung des im $texttt{unique_ptr}$ gespeicherten Rohzeigers in den gewünschten abgeleiteten Typ unter Beibehaltung der Eigentumssemantik.

Umwandlung durch Freigabe und Neuzuweisung:

Die Frage schlägt eine Methode zum Freigeben des Objekts aus $texttt{unique_ptr}$ und zum anschließenden Umwandeln des Rohzeigers in den gewünschten abgeleiteten Typ vor. Dieser Ansatz ist konzeptionell gültig, weist jedoch einen potenziellen Nachteil auf: Die Lebensdauer des Objekts wird vorübergehend von einem Rohzeiger verwaltet, was zu Speicherverlusten führen kann, wenn der Aufrufer den $texttt{unique_ptr}$ anschließend nicht ordnungsgemäß verarbeitet.

Alternative: Statisches und dynamisches Unique Pointer Casting:

Um dieses Problem zu beheben, können wir Folgendes nutzen Folgende Funktionsvorlagen:

  • $texttt{static_unique_ptr_cast}$: Führt statisches Casting durch, vorausgesetzt, dass der Rohzeiger garantiert vom gewünschten abgeleiteten Typ ist.
  • $texttt{dynamic_unique_ptr_cast}$ : Führt eine dynamische Umwandlung durch und verwendet $texttt{dynamic_cast}$, um die Umwandlung zu überprüfen Gültigkeit.

Implementierung:

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());
}
Nach dem Login kopieren

Verwendung:

Verwenden Sie $texttt{static_unique_ptr_cast}$ wann Sie sind sich über den abgeleiteten Typ sicher. Andernfalls verwenden Sie $texttt{dynamic_unique_ptr_cast}$, um zur Laufzeit zu prüfen, ob der richtige Typ vorliegt. Diese Funktionen verwenden R-Wert-Referenzen, um unbeabsichtigte Änderungen am ursprünglichen $texttt{unique_ptr}$ zu verhindern.

Das obige ist der detaillierte Inhalt vonWie kann ich in C einen „unique_ptr' sicher in einen „unique_ptr' umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage