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