std:: get_temporary_buffer
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<memory>
|
||
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(bis C++11) | |
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(seit C++11)
(veraltet in C++17) (entfernt in C++20) |
|
Wenn count negativ oder null ist, tut nichts.
Andernfalls fordert es die Zuweisung von nicht initialisiertem zusammenhängendem Speicher für
count
benachbarte Objekte des Typs
T
an. Die Anforderung ist nicht bindend, und die Implementierung kann stattdessen Speicher für eine beliebige andere Anzahl (einschließlich null) benachbarter Objekte des Typs
T
zuweisen.
|
Es ist implementierungsdefiniert, ob überalignierte Typen unterstützt werden. |
(since C++11) |
Inhaltsverzeichnis |
Parameter
| count | - | die gewünschte Anzahl an Objekten |
Rückgabewert
Ein
std::pair
, wobei das Mitglied
first
ein Zeiger auf den Anfang des allokierten Speichers ist und das Mitglied
second
die Anzahl der Objekte angibt, die in den tatsächlich allokierten Speicher passen.
Wenn
count
<=
0
oder der allokierte Speicher nicht ausreicht, um ein einzelnes Element vom Typ
T
zu speichern, ist das Mitglied
first
des Ergebnisses ein Nullzeiger und das Mitglied
second
ist null.
Hinweise
Diese API wurde ursprünglich mit der Absicht entworfen, eine effizientere Implementierung als der allgemeine operator new zu bieten, aber es wurde keine solche Implementierung erstellt und die API wurde als veraltet markiert und entfernt.
Beispiel
#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); // erfordert, dass p.first an return_temporary_buffer übergeben wird // (Vorsicht bei vorzeitigen Austrittspunkten und Exceptions), oder besser: 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)); // hat denselben Effekt wie: std::uninitialized_copy(s, s + p.second, p.first); // erfordert, dass jeder string in p einzeln zerstört wird // (Vorsicht bei vorzeitigen Austrittspunkten und 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>(); }); // dasselbe wie: std::destroy(p.first, p.first + p.second); // Speicher manuell freigeben, wenn unique_ptr-ähnliche Technik nicht verwendet wird: // std::return_temporary_buffer(p.first); }
Ausgabe:
string 1 test ... returning temporary buffer...
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 425 | C++98 | das Verhalten bei count <= 0 war unklar | klargestellt |
| LWG 2072 | C++98 | es war nicht erlaubt, unzureichenden Speicher zu allozieren | erlaubt |
Siehe auch
|
(deprecated in C++17)
(removed in C++20)
|
Gibt nicht initialisierten Speicher frei
(Funktions-Template) |
|
[static]
(C++23)
|
Allokiert Speicher mindestens in der angeforderten Größe über einen Allokator
(öffentliche statische Member-Funktion von
std::allocator_traits<Alloc>
)
|