Aké inteligentné ukazovatele (smart pointers) poznáte?
sobes.tech AI
Odpoveď od AI
std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr (zastarjelo u C++11 i uklonjeno u C++17).
-
std::unique_ptr: Ekskluzivno vlasništvo nad resursom. Resurs se oslobađa kada pokazivač izađe iz opsega ili se resetuje. Ne dozvoljava kopiranje, samo pomeranje.#include <memory> int main() { std::unique_ptr<int> ptr(new int(5)); // std::unique_ptr<int> ptr2 = ptr; // Greška: ne kopira se std::unique_ptr<int> ptr3 = std::move(ptr); // Pomeranje return 0; } -
std::shared_ptr: Zajedničko vlasništvo nad resursom. Koristi brojač referenci. Resurs se oslobađa kada poslednjishared_ptrkoji ga ukazuje izađe iz opsega ili se resetuje. Podržava kopiranje.#include <memory> int main() { std::shared_ptr<int> ptr1(new int(10)); std::shared_ptr<int> ptr2 = ptr1; // Kopiranje, brojač referenci se povećava return 0; } -
std::weak_ptr: Ne poseduje resurs i ne povećava brojač referencishared_ptr. Koristi se za sprečavanje cikličnih referenci izmeđushared_ptr. Za pristup resursu potrebno je dobitishared_ptrpomoću metodelock().#include <memory> int main() { std::shared_ptr<int> shared_ptr_inst(new int(20)); std::weak_ptr<int> weak_ptr_inst = shared_ptr_inst; // Kreiranje weak_ptr if (auto locked_ptr = weak_ptr_inst.lock()) { // Uspešno dobijen shared_ptr, može se koristiti resurs } else { // Resurs je već oslobođen } return 0; } -
std::auto_ptr: Zastareli pametni pokazivač sa semantikom vlasništva pri kopiranju, što je dovodilo do nejasnog ponašanja. Ne preporučuje se za korišćenje u novom kodu.
Razlike između shared_ptr i weak_ptr:
| Osobina | std::shared_ptr |
std::weak_ptr |
|---|---|---|
| Vlasništvo nad resursom | Da | Ne |
| Brojač referenci | Povećava | Ne povećava |
| Oslobađanje resursa | Da, kada je brojač = 0 | Ne |
| Ciklične reference | Mogu izazvati | Pomaže sprečiti |
| Pristup resursu | Direktno operator*, operator-> |
Kroz metod lock() |