void operator delete(void* ptr) throw(); // (1) C++03 まで
void operator delete(void* ptr) noexcept; // (1) C++11 から
void operator delete(void* ptr, std::size_t size) noexcept; // (2) C++14 から
void operator delete(void* ptr, std::align_val_t alignment) noexcept; // (3) C++17 から
void operator delete(void* ptr, std::size_t size, std::align_val_t alignment) noexcept; // (4) C++17 から
void operator delete(void* ptr, const std::nothrow_t&) throw(); // (5) C++03 まで
void operator delete(void* ptr, const std::nothrow_t&) noexcept; // (5) C++11 から
void operator delete(void* ptr, std::align_val_t alignment, const std::nothrow_t&) noexcept; // (6) C++17 から
void operator delete(void* ptr, void*) throw(); // (7) C++03 まで
void operator delete(void* ptr, void*) noexcept; // (7) C++11 から
概要
動的に確保された単一オブジェクトの記憶域を解放する。
- (1) : 単純な記憶域の解放
- (2) : オブジェクトサイズが判明している場合の、単一オブジェクトの記憶域の解放
- (3) : デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (4) : オブジェクトサイズが判明している場合の、デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (5) : 単純な記憶域の解放。例外を送出しない設定で記憶域を確保されたオブジェクトに対する、単一オブジェクトの記憶域の解放
- (6) : 単純な記憶域の解放。例外を送出しない設定で記憶域を確保されたオブジェクトに対する、デフォルトより大きいアライメント要求の、単一オブジェクトの記憶域の解放
- (7) : 配置newで確保された記憶域の解放
効果
new
演算子によって動的に確保した記憶域を解放する。
nothrow
版のdelete
演算子は、nothrow
版のnew
演算子によって生成されたオブジェクトのコンストラクタが例外を送出した場合に呼び出される。
備考
alignment
引数を取らないdelete
演算子に渡されるptr
は、alignment
引数を取らないnew
演算子によって確保されたものでなければならない。alignment
引数を取るdelete
演算子に渡されるptr
は、同じalignment
の値を取ったalignment
版new
演算子によって確保されたものでなければならない。
例
#include <iostream>
#include <new>
int main()
{
try {
// int型変数を動的に作成
// 確保失敗時にbad_alloc例外が送出される
int* p1 = new int();
delete p1; // p1の領域を解放
// int型変数を動的に作成
// 確保失敗時にヌルポインタが返される
int* p2 = new (std::nothrow) int();
delete p2;
}
catch (std::bad_alloc& e) {
std::cout << e.what() << std::endl;
throw;
}
}
出力