Namespaces
Variants

std:: default_delete

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定義ヘッダ <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 [ ] を使用します。

目次

メンバー関数

(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)
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以降)
(constexpr C++23以降)
配列の特殊化
template < class U >
void operator ( ) ( U * ptr ) const ;
(2) (C++11以降)
(constexpr C++23以降)
1) delete ptr に対して呼び出す。
2) delete [ ] ptr に対して呼び出す。
このオーバーロードは、 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)
ユニークなオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)