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 { // Обектът вече е изтрит }