GeezerVison is showing cpprefjp.github.io — std::default_delete::operator() - cpprefjp C++日本語リファレンス
最終更新日時:
2026年08月27日 11時39分30秒 (JST)
Akira Takahashi
が更新
履歴
編集
function
<memory>
std:: default_delete:: operator() (C++11)
// 単一オブジェクト版
void operator ()( T * ptr ) const ; // (1) C++11
constexpr void operator ()( T * ptr ) const ; // (1) C++23
// 配列版 (default_delete<T[]>)
void operator ()( T * ptr ) const ; // (2) C++11
// C++14まで
template < class U >
void operator ()( U * ptr ) const = delete ; // (3) C++11
// C++14まで
template < class U >
void operator ()( U * ptr ) const ; // (4) C++17
template < class U >
constexpr void operator ()( U * ptr ) const ; // (4) C++23
概要
渡されたポインタが指すオブジェクトを削除する。
(1) : deleteによって単一オブジェクトを削除する
(2), (4) : delete[]によって配列を削除する
(3) : T*以外のポインタを受け取らないようにするための、delete定義されたオーバーロード
テンプレートパラメータ制約
(4) : U(*)[]がT(*)[]に変換可能であること。満たさない場合はオーバーロード解決に参加しない
適格要件
(1), (2) : 型Tが完全型であること
(4) : 型Uが完全型であること
効果
(1) : delete ptr;を呼び出す
(2), (4) : delete[] ptr;を呼び出す
戻り値
なし
備考
(3) : 配列版にT*へ暗黙変換できる派生クラスのポインタを渡せてしまうと、要素サイズの不一致によりdelete[]が誤った動作をする。これを防ぐため、T*以外を受け取るオーバーロードがdelete定義されていた。
(4) : C++17で(2)と(3)がこのオーバーロードに置き換えられた。U(*)[]からT(*)[]への変換 (int[]からconst int[]への変換など) が可能な場合に限って呼び出せるため、delete定義されたオーバーロードを別途用意する必要がなくなった。
例
#include <memory>
#include <iostream>
struct X {
~ X () { std::cout << "~X()" << std::endl ; }
};
int main ()
{
// (1) 単一オブジェクトの削除
std::default_delete < X > d1 ;
d1 ( new X ());
// (2), (4) 配列の削除
std::default_delete < X [] > d2 ;
d2 ( new X [ 2 ]);
}
出力
~X()
~X()
~X()
バージョン
言語
関連項目
参照