Sobes.tech
Junior

Кайсы акылдуу көрсөткүчтөрдү (smart pointers) билесиз?

sobes.tech AI

AIден жооп

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()