std:: default_delete
|
定義ヘッダ
<memory>
|
||
|
template
<
class
T
>
struct
default_delete
;
|
(1) | (C++11以降) |
|
template
<
class
T
>
struct
default_delete
<
T
[
]
>
;
|
(2) | (C++11以降) |
std::default_delete
は、削除子が指定されていない場合に
std::unique_ptr
で使用されるデフォルトの破棄ポリシーです。
default_delete
の特殊化は、一般的な実装では空のクラスであり、
空基底クラス最適化
で使用されます。
default_delete
は、単一オブジェクトのメモリを解放するために
delete
を使用します。
目次 |
メンバー関数
|
(constructor)
|
default_delete
オブジェクトを構築する
(public member function) |
|
operator()
|
オブジェクトまたは配列を削除する
(public member function) |
std::default_delete:: default_delete
|
constexpr
default_delete
(
)
noexcept
=
default
;
|
(1) | |
|
プライマリテンプレートの特殊化
|
||
|
template
<
class
U
>
default_delete ( const default_delete < U > & d ) noexcept ; |
(2) |
(C++11以降)
(C++23以降 constexpr) |
|
配列の特殊化
|
||
|
template
<
class
U
>
default_delete ( const default_delete < U [ ] > & d ) noexcept ; |
(3) |
(C++11以降)
(C++23以降 constexpr) |
std::default_delete
オブジェクトを構築します。
std::default_delete
オブジェクトから
std::default_delete<T>
オブジェクトを構築します。
U*
が
T*
に暗黙的に変換可能な場合にのみオーバーロード解決に参加します。
std::default_delete<U[]>
オブジェクトから
std::default_delete<T[]>
オブジェクトを構築します。
U(*)[
が
T(*)[
に暗黙的に変換可能な場合にのみオーバーロード解決に参加します。
パラメータ
| d | - | コピー元のデリーター |
注記
std::default_delete
の変換コンストラクタテンプレートにより、
std::
unique_ptr
<
Derived
>
から
std::
unique_ptr
<
Base
>
への暗黙的な変換が可能になります。
std::default_delete:: operator()
|
プライマリテンプレートの特殊化
|
||
|
void
operator
(
)
(
T
*
ptr
)
const
;
|
(1) |
(C++11以降)
(constexpr C++23以降) |
|
配列の特殊化
|
||
|
template
<
class
U
>
void operator ( ) ( U * ptr ) const ; |
(2) |
(C++11以降)
(constexpr C++23以降) |
U(*)[]
が
T(*)[]
に暗黙的に変換可能な場合にのみオーバーロード解決に参加する。
U
が不完全型の場合、プログラムは不適格となる。
パラメータ
| ptr | - | 削除するオブジェクトまたは配列 |
例外
例外保証はない。
不完全型に対する呼び出し
コード内で operator ( ) が呼び出される時点で、型は完全でなければなりません。一部の実装では、これが確実に行われるように static_assert が使用されます。この要件の理由は、不完全な型に対する delete の呼び出しは、完全なクラス型が非自明なデストラクタまたは解放関数を持つ場合、C++では未定義動作となるためです。コンパイラはそのような関数が存在し呼び出される必要があるかどうかを知る手段を持たないからです。
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_constexpr_memory
|
202202L
|
(C++23) | constexpr コンストラクタと operator ( ) |
例
#include <algorithm> #include <memory> #include <vector> int main() { // { // std::shared_ptr<int> shared_bad(new int[10]); // } // デストラクタがdeleteを呼び出す、未定義動作 { std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>()); } // OK: デストラクタがdelete[]を呼び出す { std::unique_ptr<int> ptr(new int(5)); } // unique_ptr<int>はdefault_delete<int>を使用 { std::unique_ptr<int[]> ptr(new int[10]); } // unique_ptr<int[]>はdefault_delete<int[]>を使用 // default_deleteはdeleteファンクタが必要な場所で使用可能 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>()); }
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2118 | C++11 | member functions of the array specializations rejected qualification conversions | 受け入れる |
関連項目
|
(C++11)
|
ユニークなオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート) |