Namespaces
Variants

std::allocator<T>:: deallocate

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)
void deallocate ( T * p, std:: size_t n ) ;
(constexpr C++20以降)

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

引数 n は、 p を元々生成した allocate() 呼び出しの第一引数と等しくなければならない 、または p allocate_at_least ( m ) の呼び出しから取得された場合(この呼び出しが { p, count } を返した)、範囲 [ m , count ] 内でなければならない (C++23以降) 。そうでない場合、動作は未定義である。

:: operator delete ( void * ) または :: operator delete ( void * , std:: align_val_t ) (C++17以降) を呼び出しますが、いつどのように呼び出されるかは未規定です。

定数式の評価において、この関数は同じ式の評価内で割り当てられた記憶域を解放しなければならない。

(C++20以降)

目次

パラメータ

p - allocate() または allocate_at_least() (C++23以降) から取得したポインタ
n - allocate() に以前渡されたオブジェクト数、または allocate_at_least() 経由で要求された数と実際に割り当てられた数の間の数(いずれかの境界値と等しい場合もある) (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); // 例外をスローする可能性あり
        for (std::size_t i{}; i != n; ++i)
        {
        //  allocator.construct(&s[i], i + 42); // C++20で削除
            std::construct_at(&s[i], i + 42);   // 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)
[static]
アロケータを使用して記憶域を解放する
(public static member function of std::allocator_traits<Alloc> )