Quali sono gli usi equivalenti di ciascun puntatore intelligente rispetto a simili (ma non limitate a) alcune tecniche avanzate che utilizzano puntatori grezzi ?std :: unique_ptr vs std :: auto_ptr vs std :: weak_ptr vs std :: auto_ptr vs puntatori grezzi
La mia comprensione è minimo, ma da quello che ho potuto capire:
- Raw Puntatori: Utilizzare solo se davvero, davvero, davvero, davvero, sapere cosa si sta facendo e hanno accuratamente nascosto l'utilizzo dietro un'interfaccia
- std :: auto_ptr: Obsoleto mai usato.
- std :: unique_ptr: Puntatore Singleton che trasferisce la proprietà al momento dell'assegnazione.
- std :: shared_ptr: Puntatore conteggiato di riferimento che non trasferisce la proprietà al momento dell'assegnazione ma incrementa il conteggio dei riferimenti. Quando tutti i riferimenti lasciano lo scope o sono esplicitamente
std::shared_ptr::reset
viene chiamato il sottostantedeallocator
. - std :: weak_ptr: Un sottotipo
std::shared_ptr
che non incrementa il conteggio dei riferimenti e viene invalidato quando il relativo elemento principalestd::shared_ptr
non esiste più. Può restituire e riferimento non valido. Controllare sempre prima dell'uso.
RAW POINTER esempi equivalenti
conteggio di riferimento, implementazioni della cache:std::map<std::string, std::pair<long, BITMAP*> > _cache;
singletons con trasferimento di proprietà:
class Keyboard {
public:
//...
static Keyboard* CreateKeyboard();
~Keyboard();
//...
private:
//...
Keyboard();
static Keyboard* _instance;
//...
};
aggregato Con recipienti, non di proprietà: grafici di partizionamento spaziali e alberi, contenitori iterativi, ecc
Composite Container, di proprietà: oggetti di grandi dimensioni.
--EDIT--
Come sto lavorando mi sono imbattuto in un caso interessante, DeadMG ricordato che puntatori intelligenti dovrebbero essere utilizzati come semplici astrazioni per prendersi cura della gestione delle risorse; che dire degli oggetti scope-scope che non possono essere creati sull'heap al punto di dichiarazione ma che devono invece essere creati in un secondo momento?
Non capisco cosa stai chiedendo. Come implementare il comportamento intelligente del puntatore con i puntatori grezzi? –
Non ho idea di cosa sia questa domanda, ma se stai chiamando 'unique_ptr' un puntatore Singleton, sospetto che tu abbia un significato completamente diverso di Singleton qui. – Puppy
@NeilKirk L'esatto contrario, in realtà, quali sono gli usi dei puntatori intelligenti rispetto ai puntatori grezzi? vale a dire quale idioma è ogni puntatore intelligente dovrebbe sostituire? – Casey