Функция launder
Функция launder из заголовочного файла <new> возвращает указатель на объект, который был создан в уже существующей области памяти. Она используется для продления времени жизни объекта и предотвращения неопределенного поведения при доступе к памяти, которая была переиспользована. В первый параметр мы передаем указатель на область памяти, в которой находится объект.
Синтаксис
template <class T>
constexpr T* launder(T* p) noexcept;
Пример
Давайте создадим объект в буфере памяти с помощью placement new и получим корректный указатель с помощью launder:
#include <iostream>
#include <new>
using namespace std;
struct Point
{
int x;
int y;
};
int main()
{
alignas(Point) unsigned char buf[sizeof(Point)];
Point* p1 = new (buf) Point{1, 2};
Point* p2 = launder(reinterpret_cast<Point*>(buf));
cout << p2->x << " " << p2->y << endl;
p1->~Point();
return 0;
}
Результат выполнения кода:
1 2
Пример
Давайте переиспользуем память, занятую одним объектом, для создания другого объекта и получим корректный указатель через launder:
#include <iostream>
#include <new>
using namespace std;
struct A
{
int value;
};
struct B
{
int value;
};
int main()
{
alignas(B) unsigned char buf[sizeof(B)];
A* pa = new (buf) A{5};
cout << pa->value << endl;
pa->~A();
B* pb = new (buf) B{10};
B* pb2 = launder(reinterpret_cast<B*>(buf));
cout << pb2->value << endl;
pb->~B();
return 0;
}
Результат выполнения кода:
5
10
Смотрите также
-
оператор
placement new,
который создает объект в готовой памяти -
функция
construct_at,
которая создает объект в указанной памяти -
функция
destroy_at,
которая разрушает объект по указателю -
функция
addressof,
которая получает адрес объекта