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 desde C++20)

Libera el almacenamiento referenciado por el puntero p , que debe ser un puntero obtenido por una llamada anterior a allocate() o allocate_at_least() (desde C++23) .

El argumento n debe ser igual al primer argumento de la llamada a allocate() que originalmente produjo p , o en el rango [ m , count ] si p se obtuvo de una llamada a allocate_at_least ( m ) que devolvió { p, count } (desde C++23) ; de lo contrario, el comportamiento es indefinido.

Llama a :: operator delete ( void * ) o :: operator delete ( void * , std:: align_val_t ) (desde C++17) , pero no está especificado cuándo ni cómo se llama.

En la evaluación de una expresión constante, esta función debe desasignar el almacenamiento asignado dentro de la evaluación de la misma expresión.

(since C++20)

Contenidos

Parámetros

p - puntero obtenido de allocate() o allocate_at_least() (desde C++23)
n - número de objetos pasado anteriormente a allocate() , o un número entre el solicitado y el realmente asignado mediante allocate_at_least() (puede ser igual a cualquiera de los límites) (desde C++23)

Valor de retorno

(ninguno)

Ejemplo

#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); // puede lanzar excepción
        for (std::size_t i{}; i != n; ++i)
        {
        //  allocator.construct(&s[i], i + 42); // eliminado en C++20
            std::construct_at(&s[i], i + 42);   // desde 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'; }
}

Salida:

#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();

Véase también

asigna almacenamiento no inicializado
(función miembro pública)
asigna almacenamiento no inicializado de al menos el tamaño solicitado
(función miembro pública)
[static]
desasigna almacenamiento usando el asignador
(función miembro estática pública de std::allocator_traits<Alloc> )