std::unique_ptr
raggiunge la semantica della proprietà singola fornendo solo un costruttore di spostamenti e nessun costruttore di copia o operatore di assegnazione.
Non è affatto un caso di singleton, poiché è possibile avere più unique_ptrs
riferimento a istanze diverse dello stesso tipo. Un singleton non ti consente di costruire direttamente il tipo, ma fornisce una funzione di accesso che gestisce una sola istanza.
Inoltre, l'asserzione di Drew che
"A unique_ptr assicura solo un puntatore intelligente a qualsiasi istanza".
è falso. Se semplicemente fare:
T* nt = new T;
std::unique_ptr<T> up1(nt);
std::unique_ptr<T> up2(nt);
allora hai due puntatori uniche che possiedono la stessa risorsa - e si noterà un problema solo in fase di esecuzione, non è tempo di compilazione. Naturalmente, questo è un uso errato di unique_ptr
, ma ciò rafforza il fatto che un unique_ptr
non garantisce nulla, è semplicemente un contenitore di puntatori che detiene la proprietà esclusiva dalla sua prospettiva e, tramite la sua API, rende difficile creare accidentalmente copie temporanee .
Inoltre, è possibile avere altri tipi di puntatori (intelligenti) che puntano allo stesso puntatore/risorsa raw indipendentemente da qualsiasi unique_ptr
. Dipende completamente dal codice di utilizzo per definire le politiche di proprietà e durata delle risorse e le istanze dei puntatori intelligenti
fonte
2013-04-09 15:51:20
Non capisco come hai raggiunto questa conclusione! –
Beh, ci può essere un numero arbitrario di istanze di un 'std :: unique_ptr' ... –
juanchopanza
@sftrabbit Ho confuso il principio di 'singleton' con quello di' std :: unique_ptr' in qualche modo maciullato.Grazie a tutti per aver fornito chiarimenti. – Mushy