Namespaces
Variants

std:: default_delete

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 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 in typischen Implementierungen leere Klassen und werden bei der Optimierung leerer Basisklassen verwendet.

1) Die nicht spezialisierte default_delete verwendet delete , um Speicher für ein einzelnes Objekt freizugeben.
2) Eine partielle Spezialisierung für Array-Typen, die delete [ ] verwendet, wird ebenfalls bereitgestellt.

Inhaltsverzeichnis

Memberfunktionen

(constructor)
konstruiert ein default_delete Objekt
(öffentliche Elementfunktion)
operator()
löscht das Objekt oder Array
(öffentliche Elementfunktion)

std::default_delete:: default_delete

constexpr default_delete ( ) noexcept = default ;
(1)
Primäre Template-Spezialisierungen
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)
1) Konstruiert ein std::default_delete -Objekt.
2) Konstruiert ein std::default_delete<T> -Objekt aus einem anderen std::default_delete -Objekt.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn U* implizit in T* konvertierbar ist.
3) Konstruiert ein std::default_delete<T[]> -Objekt aus einem anderen std::default_delete<U[]> -Objekt.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn U(*)[] implizit in T(*)[] konvertierbar ist.

Parameter

d - ein zu kopierender Deleter

Anmerkungen

Der konvertierende Konstruktor -Template 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 Template-Spezialisierungen
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)
1) Ruft delete auf ptr auf.
2) Ruft delete [ ] auf ptr auf.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn U(*)[] implizit in T(*)[] konvertierbar ist.
Wenn U ein unvollständiger Typ ist, ist das Programm fehlerhaft.

Parameter

ptr - ein zu löschendes Objekt oder Array

Ausnahmen

Keine Ausnahmegarantien.

Aufruf über unvollständige Typen

An der Stelle im Code, an der der operator ( ) aufgerufen wird, muss der Typ vollständig sein. In einigen Implementierungen wird ein static_assert verwendet, um dies sicherzustellen. Der Grund für diese Anforderung ist, dass der Aufruf von delete auf einem unvollständigen Typ in C++ undefiniertes Verhalten darstellt, wenn der vollständige Klassentyp einen nicht-trivialen Destruktor oder eine Freigabefunktion besitzt, da der Compiler keine Möglichkeit hat zu wissen, ob solche Funktionen existieren und aufgerufen werden müssen.

Hinweise

Feature-Test Makro Wert Std Funktion
__cpp_lib_constexpr_memory 202202L (C++23) constexpr Konstruktor und operator ( )

Beispiel

#include <algorithm>
#include <memory>
#include <vector>
int main()
{
//  {
//      std::shared_ptr<int> shared_bad(new int[10]);
//  } // der Destruktor ruft delete auf, undefiniertes Verhalten
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // OK: der Destruktor ruft delete[] auf
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> verwendet default_delete<int>
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> verwendet default_delete<int[]>
    // default_delete kann überall verwendet werden, wo ein Delete-Funktor benötigt wird
    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>());
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2118 C++11 Memberfunktionen der Array-Spezialisierungen lehnten Qualifikationskonvertierungen ab akzeptieren

Siehe auch

(C++11)
Intelligenter Zeiger mit eindeutiger Objektbesitz-Semantik
(Klassentemplate)