Класс allocator
Класс allocator из заголовочного файла memory представляет
собой шаблонный класс, который инкапсулирует операции выделения
и освобождения памяти, а также создания и уничтожения объектов
в этой памяти. Основное назначение данного класса - служить
стандартным аллокатором для контейнеров STL, таких как vector,
list, map и других. Шаблонный параметр T задает
тип объектов, для которых будет выделяться память. Класс
предоставляет методы allocate для выделения блока
неинициализированной памяти и deallocate для возврата
памяти обратно системе, а также методы construct
и destroy для управления временем жизни объектов.
Синтаксис
template <class T>
class allocator;
allocator<T> alloc;
Основные методы
Класс allocator предоставляет следующие ключевые методы
для работы с памятью:
T* allocate(size_t n);
void deallocate(T* p, size_t n);
template <class U, class... Args>
void construct(U* p, Args&&... args);
template <class U>
void destroy(U* p);
Пример
Давайте выделим память для 5 элементов типа int
с помощью аллокатора, создадим в ней объекты и выведем
их значения на экран:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
allocator<int> alloc;
// Выделяем память для 5 элементов
int* arr = alloc.allocate(5);
// Создаем объекты в выделенной памяти
for (int i = 0; i < 5; i++)
{
alloc.construct(arr + i, (i + 1) * 10);
}
// Выводим значения
for (int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
cout << endl;
// Уничтожаем объекты
for (int i = 0; i < 5; i++)
{
alloc.destroy(arr + i);
}
// Освобождаем память
alloc.deallocate(arr, 5);
return 0;
}
Результат выполнения кода:
10 20 30 40 50
Пример
Давайте используем аллокатор для выделения памяти под строки и продемонстрируем работу с пользовательским аллокатором:
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main()
{
allocator<string> alloc;
// Выделяем память для 3 строк
string* strs = alloc.allocate(3);
// Создаем строки в выделенной памяти
alloc.construct(strs, "abcde");
alloc.construct(strs + 1, "12345");
alloc.construct(strs + 2, "hello");
// Выводим строки
for (int i = 0; i < 3; i++)
{
cout << strs[i] << " ";
}
cout << endl;
// Уничтожаем и освобождаем память
for (int i = 0; i < 3; i++)
{
alloc.destroy(strs + i);
}
alloc.deallocate(strs, 3);
return 0;
}
Результат выполнения кода:
"abcde" "12345" "hello"
Смотрите также
-
оператор
new,
который выделяет память под один объект -
оператор
delete,
который освобождает память одного объекта -
класс
allocator_traits,
который предоставляет единый интерфейс для аллокаторов -
функция
construct_at,
которая создает объект по указанному адресу