std::return_temporary_buffer
Von cppreference.com
| Definiert in Header <memory> |
||
| template< class T > void return_temporary_buffer( T* p ); |
(veraltet in C++17) (in C++20 entfernt) |
|
Deallokiert den Speicher, auf den durch p verwiesen wird.
Wenn p kein Zeigerwert ist, der durch einen früheren Aufruf von std::get_temporary_buffer zurückgegeben wurde, oder wenn er durch einen dazwischenliegenden std::return_temporary_buffer-Aufruf ungültig gemacht wurde, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| p | - | Der Zeiger, der auf den zu deallokierenden Speicher verweist |
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Ausnahmen
Wirft nichts.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <algorithm> #include <iostream> #include <iterator> #include <memory> #include <string> int main() { const std::string s[] = {"string", "1", "test", "..."}; const auto p = std::get_temporary_buffer<std::string>(4); // requires that p.first is passed to return_temporary_buffer // (beware of early exit points and exceptions), or better use: std::unique_ptr<std::string, void(*)(std::string*)> on_exit(p.first, [](std::string* p) { std::cout << "returning temporary buffer...\n"; std::return_temporary_buffer(p); }); std::copy(s, s + p.second, std::raw_storage_iterator<std::string*, std::string>(p.first)); // has same effect as: std::uninitialized_copy(s, s + p.second, p.first); // requires that each string in p is individually destroyed // (beware of early exit points and exceptions) std::copy(p.first, p.first + p.second, std::ostream_iterator<std::string>{std::cout, "\n"}); std::for_each(p.first, p.first + p.second, [](std::string& e) { e.~basic_string<char>(); }); // same as: std::destroy(p.first, p.first + p.second); // manually reclaim memory if unique_ptr-like technique is not used: // std::return_temporary_buffer(p.first); }
Ausgabe
string 1 test ... returning temporary buffer...
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2072 | C++98 | Der von std::get_temporary_buffer zugewiesene Speicher könnte mehrfach deallokiert werden |
Das Verhalten ist in diesem Fall nicht definiert. |
[bearbeiten] Siehe auch
| (veraltet in C++17)(entfernt in C++20) |
ermöglicht den Zugriff auf uninitialisierten Speicher (Funktions-Template) |