std:: default_delete
|
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.
default_delete
verwendet
delete
, um Speicher für ein einzelnes Objekt freizugeben.
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) |
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 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) |
U(*)[]
implizit in
T(*)[]
konvertierbar ist.
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) |