std::default_delete
| Definiert in Header <memory> |
||
| template< class T > struct default_delete; |
(1) | (seit C++11) |
| template< class T > struct default_delete<T[]>; |
(2) | (seit C++11) |
std::default_delete ist die standardmäßige Zerstörungsrichtlinie, die von std::unique_ptr verwendet wird, wenn kein Deleter angegeben ist. Spezialisierungen von default_delete sind bei typischen Implementierungen leere Klassen und werden bei der Empty Base Class Optimization verwendet.
default_delete verwendet delete, um Speicher für ein einzelnes Objekt freizugeben.Inhalt |
[bearbeiten] Memberfunktionen
| (Konstruktor) |
konstruiert ein default_delete-Objekt(public member function) |
| operator() |
löscht das Objekt oder Array (public member function) |
std::default_delete::default_delete
| constexpr default_delete() noexcept = default; |
(1) | |
| Primäre Vorlagenspezialisierungen |
||
| template< class U > default_delete( const default_delete<U>& d ) noexcept; |
(2) | (seit C++11) (constexpr seit C++23) |
| Array-Spezialisierungen |
||
| template< class U > default_delete( const default_delete<U[]>& d ) noexcept; |
(3) | (seit C++11) (constexpr seit C++23) |
std::default_delete-Objekt.std::default_delete<T>-Objekt aus einem anderen std::default_delete-Objekt.U* implizit in T* konvertierbar ist.std::default_delete<T[]>-Objekt aus einem anderen std::default_delete<U[]>-Objekt.U(*)[] implizit in T(*)[] konvertierbar ist.Parameter
| d | - | ein zu löschender Deleter zum Kopieren |
Anmerkungen
Die konvertierende Konstruktorvorlage von std::default_delete ermöglicht die implizite Konvertierung von std::unique_ptr<Derived> zu std::unique_ptr<Base>.
std::default_delete::operator()
| Primäre Vorlagenspezialisierungen |
||
| void operator()( T* ptr ) const; |
(1) | (seit C++11) (constexpr seit C++23) |
| Array-Spezialisierungen |
||
| template< class U > void operator()( U* ptr ) const; |
(2) | (seit C++11) (constexpr seit C++23) |
U(*)[] implizit in T(*)[] konvertierbar ist.U ein unvollständiger Typ ist, ist das Programm ill-formed.Parameter
| ptr | - | ein zu löschendes Objekt oder Array |
Ausnahmen
Keine Ausnahmegarantien.
[bearbeiten] Aufruf bei unvollständigen Typen
Zum Zeitpunkt des Aufrufs von operator() muss der Typ vollständig sein. Bei einigen Implementierungen wird ein static_assert verwendet, um sicherzustellen, dass dies der Fall ist. Der Grund für diese Anforderung ist, dass der Aufruf von delete für einen unvollständigen Typ in C++ undefiniertes Verhalten ist, wenn der vollständige Klassentyp einen nicht-trivialen Destruktor oder eine Freigabefunktion hat, da der Compiler keine Möglichkeit hat zu wissen, ob solche Funktionen existieren und aufgerufen werden müssen.
[bearbeiten] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_memory |
202202L |
(C++23) | constexpr Konstruktor und operator() |
[bearbeiten] Beispiel
#include <algorithm> #include <memory> #include <vector> int main() { // { // std::shared_ptr<int> shared_bad(new int[10]); // } // the destructor calls delete, undefined behavior { std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>()); } // OK: the destructor calls delete[] { std::unique_ptr<int> ptr(new int(5)); } // unique_ptr<int> uses default_delete<int> { std::unique_ptr<int[]> ptr(new int[10]); } // unique_ptr<int[]> uses default_delete<int[]> // default_delete can be used anywhere a delete functor is needed std::vector<int*> v; for (int n = 0; n < 100; ++n) v.push_back(new int(n)); std::for_each(v.begin(), v.end(), std::default_delete<int>()); }
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2118 | C++11 | Memberfunktionen der Array-Spezialisierungen lehnten Qualifizierungskonvertierungen ab | akzeptiert |
[bearbeiten] Siehe auch
| (C++11) |
intelligenter Zeiger mit semantisch eindeutigem Objektbesitz (Klassen-Template) |