Junior
Milyen okos mutatók vannak C++-ban?
sobes.tech MI
Válasz az MI-től
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Egyedüli tulajdonjog az objektum felett.
- Nem másolható, de mozgatható (
std::move). - Automatikusan törli az objektumot, amikor kilép a hatókörből vagy megsemmisül a
unique_ptr. - Könnyű, referencia számláló költségek nélkül.
#include <memory> // unique_ptr létrehozása std::unique_ptr<int> up1(new int(10)); // Tulajdonjog áthelyezése std::unique_ptr<int> up2 = std::move(up1); // up1 most nullptr // up2 birtokolja az objektumot -
std::shared_ptr:- Megosztott tulajdonjog az objektum felett.
- Egy referencia számlálót használ, hogy nyomon kövesse, hány
shared_ptrmutat az erőforrásra. - Az objektum törlődik, amikor az utolsó
shared_ptris megsemmisül, amely rá mutat. - Másolható és mozgatható.
- Extra költségei vannak a referencia számlálónak (általában külön allokálva).
- Ciklikus hivatkozásokat hozhat létre, ami memória szivárgáshoz vezet.
#include <memory> // shared_ptr létrehozása std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Tulajdonjog másolása std::shared_ptr<int> sp2 = sp1; // A referencia számláló növekszik // sp1 és sp2 az objektumot birtokolják -
std::weak_ptr:- Nem birtokolja az objektumot.
- Egy "gyenge" hivatkozást képvisel az objektumra, amit egy vagy több
shared_ptrkezel. - Ciklikus hivatkozások megelőzésére használják a
shared_ptr-ok között. - Nem növeli az objektum referencia számlálóját.
- Biztonságos hozzáféréshez az objektumhoz, át kell alakítani
shared_ptr-ra alock()metódussal. Ha az objektum már törölve lett, alock()üresshared_ptr-t ad vissza.
#include <memory> // shared_ptr létrehozása std::shared_ptr<int> sp = std::make_shared<int>(30); // weak_ptr létrehozása shared_ptr-ból std::weak_ptr<int> wp = sp; // Ellenőrzés és az objektum használata if (auto shared_from_weak = wp.lock()) { // Hozzáférés az objektumhoz a shared_from_weak segítségével } else { // Az objektum már törölve lett }