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

std::get_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
get_temporary_buffer
(до C++20*)
 
Определено в заголовочном файле <memory>
template< class T >

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

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

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

    get_temporary_buffer( std::ptrdiff_t count ) noexcept;
(начиная с C++11)
(устарело в C++17)
(удалено в C++20)

Если count отрицательное или нулевое значение, ничего не происходит.

Иначе запрашивается выделение неинициализированного непрерывного хранилища для count смежных объектов типа T. Запрос не является обязательным, и вместо этого реализация может выделить хранилище для любого другого количества (включая ноль) смежных объектов типа T.

Поддержка типов с избыточным выравниванием определяется реализацией.

(начиная с C++11)

Содержание

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

count желаемое количество объектов

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

std::pair, элемент first это указатель на начало выделенного хранилища, а элемент second это количество объектов, помещающихся в хранилище, которое было фактически выделено.

Если count <= 0, память не может быть выделена или выделенной памяти недостаточно для хранения одного элемента типа T, элемент first результата является нулевым указателем, а элемент second равен нулю.

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

Первоначально этот API был разработан с целью обеспечить более эффективную реализацию, чем operator new общего назначения, но такая реализация не была создана, а API был объявлен устаревшим и удалён.

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

#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 425 C++98 поведение, когда count <= 0, было неясным сделано ясным
LWG 2072 C++98 не разрешалось выделять недостаточно памяти позволено

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

(не рекомендуется в C++17)(удалено в C++20)
освобождает неинициализированное хранилище
(шаблон функции) [править]
[static] (C++23)
выделяет память не менее запрошенного размера с помощью аллокатора
(public static функция-элемент std::allocator_traits) [править]