名前空間
変種
操作

std::default_delete

提供: cppreference.com
< cpp‎ | memory
 
 
 
動的メモリ管理
スマートポインタ
(C++11)
(C++11)
(C++11)
(C++17未満)
(C++11)
default_delete
(C++11)
アロケータ
メモリリソース
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
低水準のメモリ管理
 
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 によって使用されるデフォルトの破棄ポリシーです。

1) 特殊化されていない default_delete は単一オブジェクトのためのメモリを解放するために delete を使用します。

2) delete[] を使用する配列型に対する部分特殊化も提供されます。

目次

[編集] メンバ関数

コンストラクタ
default_delete オブジェクトを構築します
(パブリックメンバ関数) [edit]
operator()
オブジェクトまたは配列を削除します
(パブリックメンバ関数) [edit]

std::default_delete::default_delete

constexpr default_delete() noexcept = default;
(1)
template <class U>
default_delete( const default_delete<U>& d ) noexcept;
(2) (default_delete のプライマリテンプレートのみのメンバ)
template<class U>
default_delete( const default_delete<U[]>& d) noexcept;
(3) (C++17以上)
(default_delete の配列特殊化のみのメンバ)
1) std::default_delete オブジェクトを構築します。
2) 別の std::default_delete オブジェクトから std::default_delete オブジェクトを構築します。 このコンストラクタは、 U*T* に暗黙に変換可能な場合にのみ、オーバーロード解決に参加します。
3) 別の std::default_delete<U[]> オブジェクトから std::default_delete<U[]> オブジェクトを構築します。 このコンストラクタは、 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++17 以降は default_delete<T[]> テンプレート特殊化のメンバではありません)
template <class U>
void operator()(U* ptr) const;
(2) (default_delete<T[]> テンプレート特殊化のみのメンバ、ただし C++17 より前では削除されたものとして定義されます)
1) ptr に対して delete (プライマリテンプレート) または delete[] (配列特殊化) を呼びます。
2) 削除されたものとして定義されます。
(C++17未満)
1) ptr に対して delete を呼びます。
2) ptr に対して delete[] を呼びます。 この関数は、 U(*)[]T(*)[] に暗黙に変換可能である場合にのみ、オーバーロード解決に参加します。
(C++17以上)

いずれの場合も、 U が不完全型の場合、プログラムは ill-formed です。

引数

ptr - 削除するオブジェクトまたは配列

例外

例外保証はありません。

[編集] 不完全型に対する呼び出し

operator() が呼ばれるコード上の場所で、型が完全型でなければなりません。 処理系によってはこれを確かなこととするために static_assert が使用されます。 この要件の理由は完全クラス型が非トリビアルなデストラクタまたは解放関数を持つ場合にその不完全型に対する delete を呼ぶことは未定義動作であるためです。 コンパイラはそのような関数が存在していて呼ばなければならないということを知る方法がありません。

[編集]

#include <memory>
#include <vector>
#include <algorithm>
 
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[]>
());
    } // デストラクタは delete[] を呼びます (OK)。
 
    {
        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 は削除ファンクタが必要な任意の場所で使用できます。
   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>());
}


[編集] 関連項目

唯一のオブジェクト所有権のセマンティクスを持つスマートポインタ
(クラステンプレート) [edit]