std:: get_temporary_buffer
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Défini dans l'en-tête
<memory>
|
||
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(jusqu'à C++11) | |
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(depuis C++11)
(déprécié en C++17) (supprimé en C++20) |
|
Si count est négatif ou nul, ne fait rien.
Sinon, demande l'allocation d'un stockage contigu non initialisé pour
count
objets adjacents de type
T
. La demande est non contraignante, et l'implémentation peut à la place allouer le stockage pour tout autre nombre (y compris zéro) d'objets adjacents de type
T
.
|
Il est défini par l'implémentation si les types sur-alignés sont pris en charge. |
(depuis C++11) |
Table des matières |
Paramètres
| count | - | le nombre souhaité d'objets |
Valeur de retour
Un
std::pair
, le membre
first
est un pointeur vers le début du stockage alloué et le membre
second
est le nombre d'objets pouvant être contenus dans le stockage effectivement alloué.
Si
count
<=
0
ou si le stockage alloué est insuffisant pour stocker un seul élément de type
T
, le membre
first
du résultat est un pointeur nul et le membre
second
est zéro.
Notes
Cette API a été initialement conçue dans l'intention de fournir une implémentation plus efficace que l'opérateur général operator new , mais aucune telle implémentation n'a été créée et l'API a été dépréciée puis supprimée.
Exemple
#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); // nécessite que p.first soit passé à return_temporary_buffer // (attention aux points de sortie anticipés et aux exceptions), ou mieux utilisez : 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)); // a le même effet que : std::uninitialized_copy(s, s + p.second, p.first); // nécessite que chaque string dans p soit détruite individuellement // (attention aux points de sortie anticipés et aux 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>(); }); // identique à : std::destroy(p.first, p.first + p.second); // récupérer manuellement la mémoire si la technique de type unique_ptr n'est pas utilisée : // std::return_temporary_buffer(p.first); }
Sortie :
string 1 test ... returning temporary buffer...
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 425 | C++98 | le comportement lorsque count <= 0 était peu clair | clarifié |
| LWG 2072 | C++98 | il n'était pas permis d'allouer une mémoire insuffisante | permis |
Voir aussi
|
(obsolète en C++17)
(supprimé en C++20)
|
libère un stockage non initialisé
(modèle de fonction) |
|
[static]
(C++23)
|
alloue un stockage d'au moins la taille demandée via un allocateur
(fonction membre statique publique de
std::allocator_traits<Alloc>
)
|