2013-08-16 19 views
15

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 sottostante deallocator.
  • std :: weak_ptr: Un sottotipo std::shared_ptr che non incrementa il conteggio dei riferimenti e viene invalidato quando il relativo elemento principale std::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?

+2

Non capisco cosa stai chiedendo. Come implementare il comportamento intelligente del puntatore con i puntatori grezzi? –

+1

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

+0

@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

risposta

4

quale idioma è ogni puntatore intelligente dovrebbe sostituire?

Ognuno di essi, mai, che alla fine ha comportato la distruzione della risorsa puntata. Quindi in altre parole, praticamente tutti loro. Non riesco a pensare a idiomi che coinvolgano i puntatori grezzi che non comportano la distruzione di una risorsa puntata. Ogni altro uso non è proprio un idioma, è solo "Usare un puntatore".

+0

I contenitori aggregati non distruggono le loro risorse puntate, ma li rimuovono da una lista. Questa è la preoccupazione principale che ho avuto quando ho studiato i puntatori intelligenti, quale puntatore intelligente sarebbe il candidato più probabile per un simile utilizzo? – Casey

+0

@Casey: se non distruggono le loro risorse puntate, perché dovrebbero usare un puntatore intelligente? I puntatori intelligenti servono a distruggere le cose. – Puppy

+0

Ok, questo è il motivo per cui ero confuso. Ogni persona che sosteneva i puntatori intelligenti che avevo letto si opponeva con veemenza all'uso di puntatori grezzi in qualsiasi forma o modo e dovrebbe essere sostituita con un puntatore intelligente. – Casey