Назад к вопросам
Middle
81
questionbank

Какие умные указатели в C++ вы знаете?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • std::unique_ptr - уникальный владелец объекта, не может быть скопирован, но может быть перемещен.
    #include <memory>
    
    int main() {
        std::unique_ptr<int> ptr(new int(10)); // Создание
        // std::unique_ptr<int> ptr2 = ptr; // Компиляционная ошибка - нет копирования
        std::unique_ptr<int> ptr3 = std::move(ptr); // Перемещение владения
        return 0;
    }
    
  • std::shared_ptr - разделяемый владелец, подсчитывает количество ссылок на объект. Объект удаляется, когда количество ссылок становится равным нулю.
    #include <memory>
    #include <iostream>
    
    int main() {
        std::shared_ptr<int> ptr(new int(20));
        std::cout << "Refs: " << ptr.use_count() << std::endl; // 1
    
        std::shared_ptr<int> ptr2 = ptr; // Копирование владельца
        std::cout << "Refs: " << ptr.use_count() << std::endl; // 2
    
        ptr.reset(); // Уменьшение счетчика ссылок
        std::cout << "Refs: " << ptr2.use_count() << std::endl; // 1
    
        return 0;
    }
    
  • std::weak_ptr - не разделяемый владелец, используется для предотвращения циклических ссылок между shared_ptr. Не увеличивает счетчик ссылок. Для доступа к объекту необходимо преобразовать в shared_ptr с помощью метода lock().
    #include <memory>
    #include <iostream>
    
    int main() {
        std::shared_ptr<int> shared_ptr(new int(30));
        std::weak_ptr<int> weak_ptr = shared_ptr; // Создание weak_ptr
    
        if (auto locked_ptr = weak_ptr.lock()) {
            std::cout << "Value: " << *locked_ptr << std::endl; // Доступ к объекту
        } else {
            std::cout << "Object expired." << std::endl;
        }
    
        shared_ptr.reset(); // Объект удален
    
        if (auto locked_ptr = weak_ptr.lock()) {
            std::cout << "Value: " << *locked_ptr << std::endl;
        } else {
            std::cout << "Object expired." << std::endl; // Объект удален
        }
    
        return 0;
    }
    
  • std::auto_ptr - устаревший (deprecated с C++11 и удаленный в C++17) умный указатель. Имел семантику перемещения при копировании, что могло привести к ошибкам. Вместо него следует использовать std::unique_ptr.
Указатель Семантика владения Копирование Перемещение Циклические ссылки
unique_ptr Уникальное Нет Да Не применимо
shared_ptr Разделяемое Да Да Может вызвать
weak_ptr Не владеет Да Да Предотвращает
auto_ptr Перемещающее (уст.) Нет (прим.) Неявно Не применимо