Кайсы акылдуу көрсөткүчтөрдү (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() |