std::allocator<T>::deallocate
來自 cppreference.com
void deallocate( T* p, std::size_t n ); |
(C++20 起為 constexpr) | |
解分配指標 p 所引用的儲存,它必須是透過先前對 allocate() 或 allocate_at_least()
(C++23 起) 的呼叫所獲得的指標。
引數 n 必須等於最初產生 p 的 allocate() 呼叫的第一個引數,或者如果 p 是從返回 {p, count} 的 allocate_at_least(m) 呼叫獲得的,則在範圍 [
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); // 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();
[編輯] 參閱
分配未初始化的儲存 (公開成員函式) | |
(C++23) |
分配至少與請求大小一樣大的未初始化儲存 (公開成員函式) |
[靜態] |
使用分配器釋放儲存 ( std::allocator_traits<Alloc> 的公開靜態成員函式) |