std::allocator<T>:: deallocate
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
(C++23)
|
||||
|
allocator::deallocate
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
| Non-member functions | ||||
|
(until C++20)
|
|
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) |
|
|
(C++23)
|
요청된 크기 이상의 초기화되지 않은 저장 공간을 할당
(public member function) |
|
[static]
|
할당자를 사용하여 저장 공간을 해제
(public static member function of
std::allocator_traits<Alloc>
)
|