РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
665 of 815 menu

Функция construct_at

Функция construct_at создает объект заданного типа в уже выделенной памяти. В первый параметр мы передаем указатель на область памяти, где должен быть создан объект, а во второй - аргументы, которые будут переданы конструктору этого объекта. Функция возвращает указатель на созданный объект. Эта функция появилась в стандарте C++20 и находится в заголовке memory.

В отличие от оператора new, функция construct_at не выделяет память самостоятельно - она лишь конструирует объект в том месте, которое вы ей укажете. Это особенно полезно при работе с аллокаторами и контейнерами, которые управляют памятью вручную.

Синтаксис

template <class T, class... Args> T* construct_at(T* location, Args&&... args);

Пример

Давайте создадим объект типа int в заранее выделенной памяти с помощью функции construct_at:

#include <iostream> #include <memory> using namespace std; int main() { // Выделяем сырую память под int void* raw = operator new(sizeof(int)); int* ptr = static_cast<int*>(raw); // Создаем объект в этой памяти construct_at(ptr, 42); cout << *ptr << endl; // Уничтожаем объект и освобождаем память destroy_at(ptr); operator delete(raw); return 0; }

Результат выполнения кода:

42

Пример

Давайте создадим объект типа string в выделенной памяти, передав аргументы конструктору через construct_at:

#include <iostream> #include <memory> #include <string> using namespace std; int main() { // Выделяем память под string void* raw = operator new(sizeof(string)); string* ptr = static_cast<string*>(raw); // Создаем строку "abcde" в этой памяти construct_at(ptr, "abcde"); cout << *ptr << endl; cout << ptr->size() << endl; // Уничтожаем объект и освобождаем память destroy_at(ptr); operator delete(raw); return 0; }

Результат выполнения кода:

"abcde" 5

Пример

Давайте создадим массив объектов типа int в выделенной памяти, используя construct_at в цикле:

#include <iostream> #include <memory> using namespace std; int main() { const int size = 5; // Выделяем память под массив int void* raw = operator new(sizeof(int) * size); int* ptr = static_cast<int*>(raw); // Создаем объекты в памяти for (int i = 0; i < size; i++) { construct_at(ptr + i, i + 1); } // Выводим значения for (int i = 0; i < size; i++) { cout << ptr[i] << " "; } cout << endl; // Уничтожаем объекты for (int i = 0; i < size; i++) { destroy_at(ptr + i); } operator delete(raw); return 0; }

Результат выполнения кода:

1 2 3 4 5

Смотрите также

  • функция destroy_at,
    которая уничтожает объект в памяти
  • оператор placement new,
    который создает объект в готовой памяти
  • функция uninitialized_copy,
    которая копирует объекты в неинициализированную память
  • функция uninitialized_fill,
    которая заполняет неинициализированную память
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить