Sobes.tech
Junior

Qaysi aqlli ko'rsatkichlarni (smart pointers) bilasiz?

sobes.tech AI

AIdan javob

std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr (устарел в C++11 и удален в C++17).

  • std::unique_ptr: Ексклюзивне володіння ресурсом. Ресурс звільняється, коли вказівник виходить з області видимості або скидається. Не допускає копіювання, лише переміщення.

    #include <memory>
    
    int main() {
        std::unique_ptr<int> ptr(new int(5));
        // std::unique_ptr<int> ptr2 = ptr; // Помилка: не копіюється
        std::unique_ptr<int> ptr3 = std::move(ptr); // Переміщення
        return 0;
    }
    
  • std::shared_ptr: Спільне володіння ресурсом. Використовує лічильник посилань. Ресурс звільняється, коли останній shared_ptr, що на нього вказує, виходить з області видимості або скидається. Підтримує копіювання.

    #include <memory>
    
    int main() {
        std::shared_ptr<int> ptr1(new int(10));
        std::shared_ptr<int> ptr2 = ptr1; // Копіювання, лічильник посилань збільшується
        return 0;
    }
    
  • std::weak_ptr: Не володіє ресурсом і не збільшує лічильник посилань shared_ptr. Використовується для запобігання циклічних посилань між shared_ptr. Для доступу до ресурсу потрібно отримати shared_ptr за допомогою методу lock().

    #include <memory>
    
    int main() {
        std::shared_ptr<int> shared_ptr_inst(new int(20));
        std::weak_ptr<int> weak_ptr_inst = shared_ptr_inst; // Створення weak_ptr
    
        if (auto locked_ptr = weak_ptr_inst.lock()) {
            // Успішно отримано `shared_ptr`, можна використовувати ресурс
        } else {
            // Ресурс вже звільнений
        }
        return 0;
    }
    
  • std::auto_ptr: Застарілий розумний вказівник з семантикою володіння при копіюванні, що призводило до неочевидної поведінки. Не слід використовувати в новому коді.

Відмінності між shared_ptr і weak_ptr:

Ознака std::shared_ptr std::weak_ptr
Володіння ресурсом Так Ні
Лічильник посилань Збільшує Не збільшує
Звільнення ресурсу Так, коли лічильник = 0 Ні
Циклічні посилання Можуть викликати проблеми Допомагає запобігти цьому
Доступ до ресурсу Безпосередньо через operator*, operator-> Через метод lock()