std::default_delete
From cppreference.com
| ヘッダ <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 の特殊化は、典型的な実装では空のクラスであり、空基底クラス最適化で使用されます。
1) 非特殊化された
default_delete は、単一オブジェクトのメモリを解放するために delete を使用します。2) 配列型に対する部分特殊化も提供されており、delete[] を使用します。
目次 |
[編集] メンバ関数
| (コンストラクタ) |
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) |
1)
std::default_delete オブジェクトを構築します。2) 別の
std::default_delete オブジェクトから std::default_delete<T> オブジェクトを構築します。 このオーバーロードは、
U* が T* に暗黙的に変換可能である場合にのみ、オーバーロード解決に参加します。3) 別の
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以降) (C++23 以降 constexpr) |
| 配列の特殊化 |
||
| template< class U > void operator()( U* ptr ) const; |
(2) | (C++11以降) (C++23 以降 constexpr) |
1)
ptr に対して delete を呼び出します。2)
ptr に対して delete[] を呼び出します。 このオーバーロードは、
U(*)[] が T(*)[] に暗黙的に変換可能である場合にのみ、オーバーロード解決に参加します。U が不完全型の場合、プログラムは不正形式となります。パラメータ
| ptr | - | 削除するオブジェクトまたは配列 |
例外
例外保証はありません。
[編集] 不完全型に対する呼び出し
operator() が呼び出されるコードの時点では、型は完全でなければなりません。一部の実装では、これを保証するために static_assert が使用されています。この要件の理由は、C++ では、完全なクラス型が自明でないデストラクタまたは解放関数を持つ場合、それらの関数が存在し呼び出される必要があるかどうかをコンパイラが知る方法がないため、不完全型に対して delete を呼び出すと未定義の動作となるためです。
[編集] 注記
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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]); // } // 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>()); }
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2118 | C++11 | 配列特殊化のメンバ関数が変換後代入を拒否 | 承認 |
[編集] 関連項目
| (C++11) |
オブジェクトの所有権を唯一のものとするセマンティクスを持つスマートポインタ (クラステンプレート) |