Namespaces
Variants

std:: inout_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definiert im Header <memory>
template < class Smart, class Pointer, class ... Args >
class inout_ptr_t ;
(seit C++23)

inout_ptr_t wird verwendet, um Typen wie Smart Pointer für Fremdfunktionen anzupassen, die den Besitz über einen Pointer* (üblicherweise T** für einen Objekttyp T ) oder einen void ** -Parameter zurücksetzen.

inout_ptr_t erfasst zusätzliche Argumente bei der Konstruktion, stellt einen Speicher für das Ergebnis bereit, auf den eine solche oben genannte Fremdfunktion zugreift, gibt den Besitz frei, der vom angepassten Smart -Objekt gehalten wird, und setzt schließlich das angepasste Smart -Objekt mit dem Ergebnis und den erfassten Argumenten zurück, wenn es zerstört wird.

inout_ptr_t verhält sich so, als ob es die folgenden nicht-statischen Datenelemente enthält:

  • eine Smart& -Referenz, die bei der Konstruktion an das angepasste Objekt gebunden wird,
  • für jedes T in Args... , ein Member vom Typ T , der bei der Konstruktion erfasst wird und für das Zurücksetzen während der Destruktion verwendet wird, und
  • ein Member-Subobjekt, das geeignet ist, einen Pointer darin zu speichern und ein void * -Objekt bereitzustellen, wobei der Pointer oder das void * -Objekt typischerweise einer Fremdfunktion zur Besitzrücksetzung übergeben wird.

Wenn Smart kein Zeigertyp ist, release ( ) wird höchstens einmal für das angepasste Objekt aufgerufen. Implementierungen können release ( ) innerhalb des Konstruktors oder vor dem Zurücksetzen innerhalb des Destruktors aufrufen, falls der Pointer -Wert nicht null ist.

Benutzer können steuern, ob jedes Argument für das Zurücksetzen durch Kopie oder durch Referenz erfasst wird, indem sie einen Objekttyp oder einen Referenztyp in Args... angeben.

Inhaltsverzeichnis

Template-Parameter

Smart - der Typ des Objekts (typischerweise ein Smart Pointer), der angepasst werden soll
Pointer - Typ des Objekts (typischerweise ein Rohzeiger), auf den eine externe Funktion für den Besitzrücksetzvorgang zugreift
Args... - Typ der erfassten Argumente, die zum Rücksetzen des angepassten Objekts verwendet werden
Typanforderungen
-
Pointer muss die Anforderungen von NullablePointer erfüllen.
-
Das Programm ist fehlerhaft, wenn Smart eine std::shared_ptr Spezialisierung ist.

Spezialisierungen

Im Gegensatz zu den meisten Klassentemplates in der Standardbibliothek müssen programmdefinierte Spezialisierungen von inout_ptr_t , die von mindestens einem programmdefinierten Typ abhängen, die Anforderungen der Primärvorlage nicht erfüllen.

Diese Lizenz erlaubt einer programmdefinierten Spezialisierung, den rohen Zeiger, der in einem nicht-standardmäßigen Smart Pointer gespeichert ist, für Fremdfunktionen verfügbar zu machen.

Memberfunktionen

konstruiert ein inout_ptr_t
(öffentliche Elementfunktion)
operator=
[gelöscht] (C++23)
inout_ptr_t ist nicht zuweisbar
(öffentliche Elementfunktion)
setzt den adaptierten Smart Pointer nach Freigabe seines Besitzes zurück
(öffentliche Elementfunktion)
konvertiert das inout_ptr_t in die Adresse des Speichers für die Ausgabe
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

(C++23)
erstellt einen inout_ptr_t mit einem assoziierten Smart Pointer und Reset-Argumenten
(Funktions-Template)

Hinweise

inout_ptr_t erwartet, dass die Fremdfunktionen den durch den Wert des gezeigten Pointer repräsentierten Besitz freigeben und ihn anschließend neu initialisieren. Da ein solcher Vorgang eindeutigen Besitz erfordert, ist die Verwendung mit std::shared_ptr nicht zulässig.

Die typische Verwendung von inout_ptr_t besteht darin, temporäre Objekte durch std::inout_ptr zu erstellen, die den angepassten Smart Pointer sofort zurücksetzen. Zum Beispiel, gegeben eine Setter-Funktion und einen Smart Pointer des entsprechenden Typs, deklariert mit int foreign_resetter ( T ** ) ; und std:: unique_ptr < T, D > up ; jeweils,

if (int ec = foreign_resetter(std::inout_ptr(up)))
    return ec;

entspricht in etwa

T *raw_p = up.get();
up.release();
int ec = foreign_resetter(&raw_p);
up.reset(raw_p);
if (ec != 0)
    return ec;

Es wird nicht empfohlen, ein inout_ptr_t Objekt mit einer anderen Speicherdauer als der automatischen Speicherdauer zu erstellen, da solcher Code wahrscheinlich hängende Referenzen erzeugt und bei der Zerstörung zu undefiniertem Verhalten führt.

Erfasste Argumente werden typischerweise in ein std:: tuple < Args... > gepackt. Implementierungen können verschiedene Mechanismen verwenden, um das Pointer - oder void * -Objekt bereitzustellen, das sie halten müssen.


Feature-Test Makro Wert Std Feature
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr , std::inout_ptr
202311L (C++26) Freestanding std::out_ptr und std::inout_ptr

Beispiel

Siehe auch

(C++23)
interagiert mit fremden Pointer-Settern und setzt einen Smart Pointer bei Zerstörung zurück
(Klassen-Template)
(C++11)
Smart Pointer mit eindeutiger Objektbesitz-Semantik
(Klassen-Template)
(C++11)
Smart Pointer mit gemeinsamer Objektbesitz-Semantik
(Klassen-Template)