命名空间
变体
操作

std::allocator<T>::deallocate

来自 cppreference.cn
< cpp‎ | 内存‎ | 分配器
 
 
内存管理库
(仅为解释目的*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(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)
未初始化存储
(until C++20*)
(until C++20*)
显式生命周期管理
 
 
void deallocate( T* p, std::size_t n );
(constexpr,自 C++20 起)

释放指针 p 引用的存储空间,该指针 p 必须是通过先前调用 allocate()allocate_at_least()(since C++23) 获得的指针。

参数 n 必须等于最初产生 pallocate() 调用的第一个参数,或者,如果 p 是通过调用 allocate_at_least(m) 获得的,并且该调用返回了 {p, count},则 n 必须在范围 [mcount] 内;否则,行为是未定义的。

调用 ::operator delete(void*) ::operator delete(void*, std::align_val_t)(since C++17),但何时以及如何调用它是未指定的。

在常量表达式的求值中,此函数必须释放在同一表达式的求值中分配的存储空间。

(自 C++20 起)

内容

[编辑] 参数

p - allocate()allocate_at_least()(since C++23) 获得的指针
n - 先前传递给 allocate() 的对象数量,或者通过 allocate_at_least() 请求和实际分配的对象数量之间的数字(可能等于任一边界)(since 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();

[编辑] 参见

分配未初始化的存储
(公共成员函数) [编辑]
分配至少与请求大小一样大的未初始化存储
(公共成员函数) [编辑]
[静态]
使用分配器释放存储
(std::allocator_traits<Alloc> 的公共静态成员函数) [编辑]