std::allocator<T>:deallocate
| void deallocate( T* p, std::size_t n ); |
(constexpr seit C++20) | |
Gibt den Speicher frei, auf den der Zeiger p verweist, der ein Zeiger sein muss, der durch einen früheren Aufruf von allocate() oder allocate_at_least()(seit C++23) erhalten wurde.
Das Argument n muss gleich dem ersten Argument des Aufrufs von allocate() sein, der ursprünglich p erzeugt hat, oder im Bereich [m, count] liegen, wenn p von einem Aufruf von allocate_at_least(m) erhalten wurde, der {p, count} zurückgab(seit C++23); andernfalls ist das Verhalten undefiniert.
Ruft ::operator delete(void*) auf oder ::operator delete(void*, std::align_val_t)(seit C++17), aber es ist nicht spezifiziert, wann und wie er aufgerufen wird.
|
Bei der Auswertung eines konstanten Ausdrucks muss diese Funktion Speicher freigeben, der innerhalb der Auswertung desselben Ausdrucks zugewiesen wurde. |
(seit C++20) |
Inhalt |
[bearbeiten] Parameter
| p | - | Zeiger, der von allocate() oder allocate_at_least()(seit C++23) erhalten wurde. |
| n | - | Anzahl der Objekte, die zuvor an allocate() übergeben wurden, oder eine Zahl zwischen der angeforderten und der tatsächlich zugewiesenen Anzahl von Objekten über allocate_at_least() (kann gleich jeder Grenze sein)(seit C++23) |
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Beispiel
#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'; } }
Ausgabe
#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();
[bearbeiten] Siehe auch
| alloziiert uninitialisierten Speicher (public member function) | |
| (C++23) |
weist uninitialisierten Speicher zu, der mindestens so groß ist wie die angeforderte Größe (public member function) |
| [static] |
dealloziert Speicher mit dem Allocator (public static member function of std::allocator_traits<Alloc>) |