Зачем нужна функция make_shared
1️⃣ Как кратко ответить
Функция make_shared используется для создания объектов, управляемых std::shared_ptr, с целью повышения эффективности и безопасности. Она выделяет память для объекта и управляющего блока за одну операцию, что уменьшает накладные расходы и снижает вероятность ошибок, связанных с управлением памятью.
2️⃣ Подробное объяснение темы
std::shared_ptr — это умный указатель в C++, который управляет совместным владением объекта. Когда последний shared_ptr, указывающий на объект, уничтожается, объект также удаляется. make_shared — это функция, которая упрощает создание объектов, управляемых shared_ptr, и делает это более эффективно.
Зачем это нужно
-
Эффективность:
make_sharedвыделяет память для объекта и управляющего блока за одну операцию. Это уменьшает количество вызовов к операторуnew, что может быть критично для производительности в системах с ограниченными ресурсами. -
Безопасность: Использование
make_sharedснижает вероятность ошибок, связанных с управлением памятью, таких как утечки памяти или двойное удаление. Это достигается за счет того, чтоmake_sharedавтоматически управляет временем жизни объекта. -
Удобство:
make_sharedупрощает синтаксис созданияshared_ptr, делая код более читаемым и менее подверженным ошибкам.
Как это работает
Когда вы создаете shared_ptr с помощью make_shared, функция выделяет один блок памяти, который содержит как сам объект, так и управляющий блок. Управляющий блок хранит счетчик ссылок и другую служебную информацию, необходимую для управления временем жизни объекта.
Пример кода
#include <iostream>
#include <memory> // Подключаем заголовок для работы с умными указателями
int main() {
// Создаем shared_ptr на объект типа int с помощью make_shared
std::shared_ptr<int> ptr = std::make_shared<int>(10);
// Выводим значение, на которое указывает ptr
std::cout << "Value: " << *ptr << std::endl;
// Выводим количество shared_ptr, указывающих на тот же объект
std::cout << "Use count: " << ptr.use_count() << std::endl;
return 0;
}
Объяснение кода
-
#include <memory>: Подключает заголовочный файл, необходимый для работы с умными указателями, включаяstd::shared_ptrиstd::make_shared. -
std::shared_ptr<int> ptr = std::make_shared<int>(10);: Создаетshared_ptr, который управляет объектом типаint, инициализированным значением10.make_sharedвыделяет память и создает объект и управляющий блок за одну операцию. -
std::cout << "Value: " << *ptr << std::endl;: Выводит значение, на которое указываетptr. Оператор*разыменовывает указатель, чтобы получить доступ к значению. -
std::cout << "Use count: " << ptr.use_count() << std::endl;: Выводит количествоshared_ptr, указывающих на тот же объект. Это полезно для отслеживания совместного владения объектом.
Использование make_shared делает код более эффективным и безопасным, минимизируя риск ошибок, связанных с управлением памятью.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться