Namespaces
Variants

std:: get_temporary_buffer

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* )
get_temporary_buffer
( 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)
Definiert im Header <memory>
template < class T >

std:: pair < T * , std:: ptrdiff_t >

get_temporary_buffer ( std:: ptrdiff_t count ) ;
(bis C++11)
template < class T >

std:: pair < T * , std:: ptrdiff_t >

get_temporary_buffer ( std:: ptrdiff_t count ) noexcept ;
(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> )