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