← Назад ко всем вопросам

Зачем нужна функция make_shared

1️⃣ Как кратко ответить

Функция make_shared используется для создания объектов, управляемых std::shared_ptr, с целью повышения эффективности и безопасности. Она выделяет память для объекта и управляющего блока за одну операцию, что уменьшает накладные расходы и снижает вероятность ошибок, связанных с управлением памятью.

2️⃣ Подробное объяснение темы

std::shared_ptr — это умный указатель в C++, который управляет совместным владением объекта. Когда последний shared_ptr, указывающий на объект, уничтожается, объект также удаляется. make_shared — это функция, которая упрощает создание объектов, управляемых shared_ptr, и делает это более эффективно.

Зачем это нужно

  1. Эффективность: make_shared выделяет память для объекта и управляющего блока за одну операцию. Это уменьшает количество вызовов к оператору new, что может быть критично для производительности в системах с ограниченными ресурсами.

  2. Безопасность: Использование make_shared снижает вероятность ошибок, связанных с управлением памятью, таких как утечки памяти или двойное удаление. Это достигается за счет того, что make_shared автоматически управляет временем жизни объекта.

  3. Удобство: 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 делает код более эффективным и безопасным, минимизируя риск ошибок, связанных с управлением памятью.

Тема: Умные указатели / Владение
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки