std::allocator<T>::deallocate
From cppreference.com
| void deallocate( T* p, std::size_t n ); |
(C++20 以降 constexpr) | |
ポインタpが参照するストレージを解放します。このポインタは、以前の allocate() または allocate_at_least()(since C++23) の呼び出しによって取得されたものである必要があります。
引数 n は、最初に p を生成した allocate() の呼び出しの最初の引数と等しい必要があります。または、p が allocate_at_least(m) の呼び出しによって取得され、その呼び出しが {p, count} を返した場合、n は m と count の範囲内(両端を含む)である必要があります(since C++23)。それ以外の場合は、未定義の動作となります。
::operator delete(void*) または ::operator delete(void*, std::align_val_t)(since C++17) を呼び出しますが、いつどのように呼び出されるかは未規定です。
|
定数式の評価において、この関数は同じ式の評価内で割り当てられたストレージを解放しなければなりません。 |
(C++20以降) |
目次 |
[編集] パラメータ
| p | - | allocate() または allocate_at_least()(since C++23) から取得したポインタ |
| n | - | allocate() に以前渡されたオブジェクト数、または allocate_at_least() を介して要求された、または実際に割り当てられたオブジェクト数(どちらかの境界値でも可)(since C++23) |
[編集] 戻り値
(なし)
[編集] 例
このコードを実行
#include <algorithm> #include <cstddef> #include <iostream> #include <memory> #include <string> class S { inline static int n{1}; int m{}; void pre() const { std::cout << "#" << m << std::string(m, ' '); } public: S(int x) : m{n++} { pre(); std::cout << "S::S(" << x << ");\n"; } ~S() { pre(); std::cout << "S::~S();\n"; } void id() const { pre(); std::cout << "S::id();\n"; } }; int main() { constexpr std::size_t n{4}; std::allocator<S> allocator; try { S* s = allocator.allocate(n); // may throw for (std::size_t i{}; i != n; ++i) { // allocator.construct(&s[i], i + 42); // removed in C++20 std::construct_at(&s[i], i + 42); // since C++20 } std::for_each_n(s, n, [](const auto& e) { e.id(); }); std::destroy_n(s, n); allocator.deallocate(s, n); } catch (std::bad_array_new_length const& ex) { std::cout << ex.what() << '\n'; } catch (std::bad_alloc const& ex) { std::cout << ex.what() << '\n'; } }
出力
#1 S::S(42); #2 S::S(43); #3 S::S(44); #4 S::S(45); #1 S::id(); #2 S::id(); #3 S::id(); #4 S::id(); #1 S::~S(); #2 S::~S(); #3 S::~S(); #4 S::~S();
[編集] 関連項目
| 未初期化のストレージを割り当てる (public member function) | |
| (C++23) |
要求されたサイズ以上の未初期化ストレージを割り当てる (public member function) |
| [static] |
アロケータを使用してストレージを解放する ( std::allocator_traits<Alloc> の public static メンバ関数) |