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

Как можно создать std::shared_ptr

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

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

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

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

Зачем нужен std::shared_ptr

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

Как создать std::shared_ptr

1. Использование std::make_shared

Функция std::make_shared — это предпочтительный способ создания std::shared_ptr. Она создает объект и std::shared_ptr в одной операции, что более эффективно и безопасно.

#include <memory> // Подключаем заголовок для работы с умными указателями
#include <iostream>
​
int main() {
    // Создаем std::shared_ptr на объект типа int со значением 10
    std::shared_ptr<int> ptr = std::make_shared<int>(10);
​
    // Выводим значение, на которое указывает ptr
    std::cout << "Value: " << *ptr << std::endl; // Output: Value: 10
​
    // Выводим количество владельцев объекта
    std::cout << "Use count: " << ptr.use_count() << std::endl; // Output: Use count: 1
​
    return 0;
}
  • #include <memory>: Подключает заголовочный файл, необходимый для работы с std::shared_ptr.
  • std::make_shared<int>(10): Создает объект типа int со значением 10 и возвращает std::shared_ptr, управляющий этим объектом.
  • ptr.use_count(): Возвращает количество std::shared_ptr, которые совместно владеют объектом.

2. Использование конструктора std::shared_ptr

Можно создать std::shared_ptr, передав ему указатель на объект, созданный с помощью new. Однако это менее безопасно, так как может привести к утечкам памяти, если исключение будет выброшено между созданием объекта и созданием std::shared_ptr.

#include <memory>
#include <iostream>
​
int main() {
    // Создаем объект типа int со значением 20
    int* rawPtr = new int(20);
​
    // Создаем std::shared_ptr, передавая ему указатель на объект
    std::shared_ptr<int> ptr(rawPtr);
​
    // Выводим значение, на которое указывает ptr
    std::cout << "Value: " << *ptr << std::endl; // Output: Value: 20
​
    // Выводим количество владельцев объекта
    std::cout << "Use count: " << ptr.use_count() << std::endl; // Output: Use count: 1
​
    return 0;
}
  • int* rawPtr = new int(20): Создает объект типа int со значением 20 и возвращает указатель на него.
  • std::shared_ptr<int> ptr(rawPtr): Создает std::shared_ptr, который берет на себя владение объектом, на который указывает rawPtr.

Применение

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

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

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

Твои заметки