Пространства имён
Варианты
Действия

std::return_temporary_buffer

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
return_temporary_buffer
(до C++20*)
 
Определено в заголовочном файле <memory>
template< class T >
void return_temporary_buffer( T* p );
(устарело в C++17)
(удалено в C++20)

Освобождает хранилище, на которое ссылается p.

Если p не является значением указателя, возвращённым предыдущим вызовом std::get_temporary_buffer, или не является недействительным промежуточным вызовом std::return_temporary_buffer, поведение не определено.

Содержание

[править] Параметры

p указатель, ссылающийся на хранилище, которое нужно удалить

[править] Возвращаемое значение

(нет)

[править] Исключения

Ничего не генерирует.

[править] Пример

#include <algorithm>
#include <iostream>
#include <iterator>
#include <memory>
#include <string>
 
int main()
{
    const std::string s[] = {"строка", "1", "тест", "..."};
    const auto p = std::get_temporary_buffer<std::string>(4);
    // требует, чтобы p.first был передан в return_temporary_buffer
    // (остерегайтесь ранних точек выхода и исключений), а лучше используйте:
    std::unique_ptr<std::string, void(*)(std::string*)> on_exit(p.first,
    [](std::string* p)
    {
        std::cout << "возврат временного буфера...\n";
        std::return_temporary_buffer(p);
    });
 
    std::copy(s, s + p.second,
              std::raw_storage_iterator<std::string*, std::string>(p.first));
    // имеет тот же эффект, что и: std::uninitialized_copy(s, s + p.second, p.first);
    // требует, чтобы каждая строка в p уничтожалась отдельно
    // (остерегайтесь ранних точек выхода и исключений)
 
    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>();
    }); // то же, что: std::destroy(p.first, p.first + p.second);
 
    // вручную освободить память, если не используется техника, подобная unique_ptr:
    // std::return_temporary_buffer(p.first);
}

Вывод:

строка
1
тест
...
возврат временного буфера...

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2072 C++98 хранилище, выделенное std::get_temporary_buffer, могло быть
освобождено несколько раз
поведение в этом случае не определено

[править] Смотрите также

(не рекомендуется в C++17)(удалено в C++20)
получает неинициализированную память
(шаблон функции) [править]