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

Функция 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,
    которая получает адрес объекта
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить