Namensräume
Varianten
Aktionen

std::default_delete

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
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.

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.

Inhalt

[bearbeiten] Memberfunktionen

(Konstruktor)
konstruiert ein default_delete-Objekt
(public member function) [bearbeiten]
operator()
löscht das Objekt oder Array
(public member function) [bearbeiten]

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)
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 an der Auflösung von Überladungen 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 an der Auflösung von Überladungen teil, wenn 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)
1) Ruft delete für ptr auf.
2) Ruft delete[] für ptr auf.
Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn U(*)[] implizit in T(*)[] konvertierbar ist.
Wenn 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

intelligenter Zeiger mit semantisch eindeutigem Objektbesitz
(Klassen-Template) [edit]