Milyen okos mutatókat (smart pointers) ismersz?
sobes.tech MI
Válasz az MI-től
std::unique_ptr, std::shared_ptr, std::weak_ptr, std::auto_ptr (elavult C++11-ben és eltávolítva C++17-ben).
-
std::unique_ptr: Exkluzív tulajdonjog a forráshoz. A forrás felszabadul, amikor a mutató kilép a hatókörből vagy resetelésre kerül. Nem enged másolást, csak mozgást.#include <memory> int main() { std::unique_ptr<int> ptr(new int(5)); // std::unique_ptr<int> ptr2 = ptr; // Hiba: nem másolható std::unique_ptr<int> ptr3 = std::move(ptr); // Mozgatás return 0; } -
std::shared_ptr: Közös tulajdonjog a forráshoz. Referenciaszámlálót használ. A forrás felszabadul, amikor az utolsóshared_ptr, amely rá mutat, kilép a hatókörből vagy resetelésre kerül. Másolást támogat.#include <memory> int main() { std::shared_ptr<int> ptr1(new int(10)); std::shared_ptr<int> ptr2 = ptr1; // Másolás, a számláló növekszik return 0; } -
std::weak_ptr: Nem birtokolja a forrást, és nem növeli ashared_ptrreferencianszámlálóját. Ciklikus hivatkozások megelőzésére használják. A forráshoz való hozzáféréshezshared_ptr-t szerez alock()metódussal.#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 létrehozása if (auto locked_ptr = weak_ptr_inst.lock()) { // Sikeresen szerzett `shared_ptr`, használható a forrás } else { // A forrás már felszabadult } return 0; } -
std::auto_ptr: Elavult okosmutató, tulajdonjogot jelent másoláskor, ami nem kívánt viselkedést eredményezett. Új kódban nem szabad használni.
A shared_ptr és weak_ptr közötti különbségek:
| Jellemző | std::shared_ptr |
std::weak_ptr |
|---|---|---|
| Tulajdonjog a forráshoz | Igen | Nem |
| Referencsszámoló | Növeli | Nem növeli |
| Forrás felszabadítása | Igen, amikor a számláló 0 | Nem |
| Ciklikus hivatkozások | Potenciális problémák | Segít megelőzni őket |
| Hozzáférés a forráshoz | Közvetlenül operator*, operator-> |
lock() metóduson keresztül |