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 ) 호출로부터 얻어진 경우 [ m , count ] 범위 내에 있어야 합니다 (이때 해당 호출이 { p, count } 를 반환함) (C++23부터) ; 그렇지 않으면 동작은 정의되지 않습니다.

:: operator delete ( void * ) 또는 :: operator delete ( void * , std:: align_val_t ) 를 호출하지만, 언제 어떻게 호출되는지는 명시되지 않습니다.

상수 표현식 평가 시, 이 함수는 동일한 표현식 평가 내에서 할당된 저장 공간을 해제해야 합니다.

(since 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> )