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

Функция destroy_at

Функция destroy_at вызывает деструктор объекта, расположенного по адресу, переданному в единственном параметре. При этом сама память по этому адресу не освобождается - она лишь помечается как больше не содержащая живого объекта. Функция появилась в стандарте C++17 и объявлена в заголовочном файле <memory>.

Обычно функцию destroy_at применяют в паре с размещающим new (placement new): сначала объект создаётся в уже выделенной памяти, а затем явно разрушается вызовом destroy_at, когда он больше не нужен. Это позволяет управлять временем жизни объекта отдельно от временем жизни памяти.

Синтаксис

#include <memory> template <class T> void destroy_at(T* location);

Пример

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

#include <iostream> #include <memory> using namespace std; int main() { alignas(int) unsigned char buffer[sizeof(int)]; int* ptr = new (buffer) int(42); cout << *ptr << endl; destroy_at(ptr); return 0; }

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

42

Пример

Давайте разрушим массив объектов в цикле, вызывая destroy_at для каждого элемента:

#include <iostream> #include <memory> #include <string> using namespace std; int main() { alignas(string) unsigned char buffer[sizeof(string) * 3]; string* arr = reinterpret_cast<string*>(buffer); for (int i = 0; i < 3; i++) { new (&arr[i]) string("abcde"); } for (int i = 0; i < 3; i++) { cout << arr[i] << " "; } cout << endl; for (int i = 0; i < 3; i++) { destroy_at(&arr[i]); } return 0; }

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

"abcde abcde abcde"

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

  • оператор new,
    который выделяет память под объект
  • оператор delete,
    который освобождает память объекта
  • функция construct_at,
    которая создаёт объект по заданному адресу
  • концепция RAII,
    которая управляет временем жизни ресурсов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить