table of contents
        
      
      
    | std::allocator::deallocate(3) | C++ Standard Libary | std::allocator::deallocate(3) | 
NAME¶
std::allocator::deallocate - std::allocator::deallocate
Synopsis¶
void deallocate( T* p, std::size_t n ); (constexpr since C++20)
  
   Deallocates the storage referenced by the pointer p, which must be a pointer
  
   obtained by an earlier call to allocate()
  
   or allocate_at_least()
  
   (since C++23).
  
   The argument n must be equal to the first argument of the call to allocate()
    that
  
   originally produced p
  
   , or in the range [m, count] if p is obtained from a call to
    allocate_at_least(m)
  
   which returned {p, count}
  
   (since C++23); otherwise, the behavior is undefined.
  
   Calls ::operator delete(void*)
  
   or ::operator delete(void*, std::align_val_t)
  
   (since C++17), but it is unspecified when and how it is called.
  
   In evaluation of a constant expression, this function must deallocate
    (since C++20)
  
   storage allocated within the evaluation of the same expression.
Parameters¶
 pointer obtained from allocate()
  
   p - or allocate_at_least()
  
   (since C++23)
  
   number of objects earlier passed to allocate()
  
   n - , or a number between requested and actually allocated number of objects
    via
  
   allocate_at_least() (may be equal to either bound)
  
   (since C++23)
Return value¶
(none)
Example¶
// Run this code
  
   #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'; }
  
   }
Output:¶
 #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();
See also¶
 allocate allocates uninitialized storage
  
   (public member function)
  
   allocate_at_least allocates uninitialized storage at least as large as
    requested
  
   (C++23) size
  
   (public member function)
  
   deallocate deallocates storage using the allocator
  
   [static] (public static member function of
    std::allocator_traits<Alloc>)
| 2024.06.10 | http://cppreference.com |