std::allocator<T>::deallocate
void deallocate( T* p, std::size_t n ); |
(constexpr начиная с C++20) |
Освобождает память, на которую указывает указатель p, который должен быть получен в результате предыдущего вызова allocate() или allocate_at_least()(начиная с C++23).
Аргумент n должен быть равен первому аргументу вызова allocate(), который первоначально произвёл p, или находиться в диапазоне [m, count] если p получен из вызова allocate_at_least(m), который вернул {p, 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>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/allocator/deallocate