名前空間
変種
操作

std::allocator<T>::deallocate

From cppreference.com
< cpp‎ | memory‎ | allocator
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
std::allocator
メンバ関数
(C++20まで)
allocator::deallocate
(C++20まで)
(C++20まで)
非メンバ関数
 
void deallocate( T* p, std::size_t n );
(C++20 以降 constexpr)

ポインタpが参照するストレージを解放します。このポインタは、以前の allocate() または allocate_at_least()(since C++23) の呼び出しによって取得されたものである必要があります。

引数 n は、最初に p を生成した allocate() の呼び出しの最初の引数と等しい必要があります。または、pallocate_at_least(m) の呼び出しによって取得され、その呼び出しが {p, count} を返した場合、nmcount の範囲内(両端を含む)である必要があります(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) [編集]
要求されたサイズ以上の未初期化ストレージを割り当てる
(public member function) [編集]
アロケータを使用してストレージを解放する
(std::allocator_traits<Alloc> の public static メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)