std:: return_temporary_buffer
From cppreference.net
C++
Memory management library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<memory>
|
||
|
template
<
class
T
>
void return_temporary_buffer ( T * p ) ; |
(obsoleto en C++17)
(eliminado en C++20) |
|
Libera el almacenamiento referenciado por p .
Si
p
no es un valor de puntero devuelto por una llamada anterior a
std::get_temporary_buffer
, o ha sido invalidado por una llamada intermedia a
std::return_temporary_buffer
, el comportamiento es indefinido.
Contenidos |
Parámetros
| p | - | el puntero que hace referencia al almacenamiento que se va a desasignar |
Valor de retorno
(ninguno)
Excepciones
No lanza nada.
Ejemplo
Ejecutar este código
#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); // requiere que p.first se pase a return_temporary_buffer // (cuidado con puntos de salida temprana y excepciones), o mejor usar: 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)); // tiene el mismo efecto que: std::uninitialized_copy(s, s + p.second, p.first); // requiere que cada string en p sea destruido individualmente // (cuidado con puntos de salida temprana y excepciones) 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>(); }); // igual que: std::destroy(p.first, p.first + p.second); // reclamar memoria manualmente si no se usa la técnica similar a unique_ptr: // std::return_temporary_buffer(p.first); }
Salida:
string 1 test ... returning temporary buffer...
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2072 | C++98 |
el almacenamiento asignado por
std::get_temporary_buffer
podría ser desasignado múltiples veces |
el comportamiento es
indefinido en este caso |
Véase también
|
(deprecated in C++17)
(removed in C++20)
|
obtiene almacenamiento no inicializado
(plantilla de función) |