Il C ++ riguarda la proprietà della memoria, ovvero la semantica della proprietà .
È responsabilità del proprietario di una porzione di memoria allocata dinamicamente rilasciare quella memoria. Quindi la domanda diventa davvero chi possiede la memoria.
In C ++ proprietà è documentata dal tipo di greggio puntatore è avvolto all'interno così una buona (IMO) C ++ programma è molto raro ( raro , non mai ) per vedere puntatori prime passate muoversi (come puntatori prime non hanno dedotto proprietà così possiamo non dire chi possiede la memoria e quindi senza un'attenta lettura della documentazione non si può dire chi è responsabile della proprietà).
Al contrario, è raro vedere puntatori non elaborati archiviati in una classe, ogni puntatore non elaborato è archiviato all'interno del proprio wrapper di puntatori intelligenti. ( NB: Se non possiedi un oggetto, non dovresti conservarlo perché non puoi sapere quando uscirà dall'ambito e verrà distrutto.)
Quindi la domanda:
- Che tipo di semantica di proprietà hanno incontrato le persone?
- Quali classi standard vengono utilizzate per implementare quelle semantiche?
- In quali situazioni le trovi utili?
Consente di mantenere 1 tipo di proprietà semantica per risposta in modo che possano essere votate su e giù individualmente.
Sommario:
Concettualmente, i puntatori intelligenti sono semplici e un'implementazione ingenua è facile. Ho visto molti tentativi di implementazione, ma invariabilmente sono rotti in un modo che non è ovvio per un uso casuale ed esempi. Quindi consiglio sempre di utilizzare puntatori intelligenti ben collaudati da una libreria piuttosto che rotolare i tuoi. std::auto_ptr
o uno dei puntatori intelligenti Boost sembra coprire tutte le mie esigenze.
std::auto_ptr<T>
:
Una sola persona possiede l'oggetto. È consentito il trasferimento di proprietà.
Utilizzo: consente di definire interfacce che mostrano il trasferimento esplicito della proprietà.
boost::scoped_ptr<T>
Una sola persona possiede l'oggetto. Il trasferimento di proprietà NON è consentito.
Utilizzo: utilizzato per mostrare la proprietà esplicita. L'oggetto verrà distrutto dal distruttore o se ripristinato in modo esplicito.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Proprietà multipla. Questo è un semplice puntatore conteggio dei riferimenti. Quando il conteggio dei riferimenti raggiunge lo zero, l'oggetto viene distrutto.
Utilizzo: quando un oggetto può avere più fiori con una durata che non può essere determinata in fase di compilazione.
boost::weak_ptr<T>
:
Utilizzato shared_ptr<T>
in situazioni in cui può verificarsi un ciclo di puntatori.
Utilizzo: utilizzato per impedire ai cicli di conservare gli oggetti quando solo il ciclo mantiene un refcount condiviso.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Può essere riformulato? Non lo capisco affatto.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. I puntatori RAW non hanno la semantica della proprietà. Se non conosci il proprietario non sai chi è responsabile dell'eliminazione dell'oggetto. Esistono diverse classi standard che vengono utilizzate per avvolgere i puntatori (std :: shared_ptr, std :: unique_ptr ecc) che definiscono la proprietà e quindi definire chi è responsabile dell'eliminazione del puntatore.