std:: return_temporary_buffer
From cppreference.net
C++
Memory management library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Défini dans l'en-tête
<memory>
|
||
|
template
<
class
T
>
void return_temporary_buffer ( T * p ) ; |
(obsolète en C++17)
(supprimé en C++20) |
|
Libère le stockage référencé par p .
Si
p
n'est pas une valeur de pointeur retournée par un appel antérieur à
std::get_temporary_buffer
, ou a été invalidée par un appel intermédiaire à
std::return_temporary_buffer
, le comportement est indéfini.
Table des matières |
Paramètres
| p | - | le pointeur référençant le stockage à désallouer |
Valeur de retour
(aucun)
Exceptions
Ne lance rien.
Exemple
Exécuter ce code
#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 correct |
|---|---|---|---|
| LWG 2072 | C++98 |
le stockage alloué par
std::get_temporary_buffer
pouvait être désalloué plusieurs fois |
le comportement est
indéfini dans ce cas |
Voir aussi
|
(déprécié en C++17)
(supprimé en C++20)
|
obtient un stockage non initialisé
(modèle de fonction) |