Sobes.tech
Junior

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

sobes.tech AI

Отговор от AI

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Ексклузивно притежание на обекта.
    • Не може да бъде копиран, но може да бъде прехвърлен (std::move).
    • Автоматично изтрива обекта при излизане от обхвата или унищожаване на unique_ptr.
    • Лек, без допълнителни разходи за брояча на препратките.
    #include <memory>
    
    // Създаване на unique_ptr
    std::unique_ptr<int> up1(new int(10));
    
    // Прехвърляне на собственост
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 сега е nullptr
    // up2 притежава обекта
    
  • std::shared_ptr:

    • Общ пренадлежност на обекта.
    • Използва брояч на препратки, за да следи колко shared_ptr сочат към ресурса.
    • Обектът се изтрива, когато последният shared_ptr, който го сочи, бъде унищожен.
    • Може да бъде копиран и прехвърлен.
    • Има допълнителни разходи за брояча на препратките (обикновено отделно разпределен).
    • Може да образува циклични препратки, което води до изтичане на памет.
    #include <memory>
    
    // Създаване на shared_ptr
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Копиране на собственост
    std::shared_ptr<int> sp2 = sp1; // Броячът на препратките се увеличава
    
    // sp1 и sp2 притежават обекта
    
  • std::weak_ptr:

    • Не притежава обекта.
    • Представлява "слака" препратка към обекта, управляван от един или повече shared_ptr.
    • Използва се за предотвратяване на циклични препратки между shared_ptr.
    • Не увеличава брояча на препратките.
    • За безопасен достъп до обекта, трябва да се преобразува в shared_ptr чрез метода lock(). Ако обектът вече е изтрит, lock() ще върне празен shared_ptr.
    #include <memory>
    
    // Създаване на shared_ptr
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // Създаване на weak_ptr от shared_ptr
    std::weak_ptr<int> wp = sp;
    
    // Проверка и използване на обекта
    if (auto shared_from_weak = wp.lock()) {
        // Достъп до обекта чрез shared_from_weak
    } else {
        // Обектът вече е изтрит
    }