Функция 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,
которая заполняет неинициализированную память