Nel C effettivo ++ standard realizzando collezioni rispondenti seguenti regole è difficile se non impossibile:unique_ptr - miglioramento importante?
- sicurezza eccezione,
- operazioni economiche interne (in contenitori STL reali: le operazioni sono copie),
- automatica gestione della memoria.
Per soddisfare (1), una raccolta non può memorizzare puntatori grezzi. Per soddisfare (2), una raccolta deve memorizzare puntatori grezzi. Per soddisfare (3), una raccolta deve memorizzare oggetti per valore.
Conclusione: i tre articoli sono in conflitto tra loro.
L'elemento (2) non sarà soddisfatto quando vengono utilizzati shared_ptr
s quando una raccolta deve spostare un elemento, sarà necessario effettuare due chiamate: a un costruttore e a un distruttore. Non sono possibili enormi operazioni di copia/spostamento come memcpy()
.
Sono corretto che il problema descritto verrà risolto da unique_ptr
e std::move()
? Collezioni che utilizzano gli strumenti saranno in grado di soddisfare tutte le 3 condizioni:
- Quando una collezione sarà cancellato come un effetto collaterale di un'eccezione, chiamerà i distruttori s'
unique_ptr
. Nessuna perdita di memoria. -
unique_ptr
non richiede spazio aggiuntivo per contatore di riferimento; pertanto il suo corpo dovrebbe essere esattamente la stessa dimensione, come puntatore avvolto,- non sono sicuro, ma sembra che questo permette di spostare gruppi di
unique_ptrs
utilizzandomemmove()
operazioni analoghe (?), - anche se è impossibile, l'operatore
std::move()
consentirà di spostare ciascun oggettounique_ptr
senza effettuare le chiamate della coppia costruttore/distruttore.
unique_ptr
avrà la proprietà esclusiva di una determinata memoria. Nessuna perdita di memoria accidentale sarà possibile.
E 'vero? Quali sono gli altri vantaggi dell'utilizzo di unique_ptr
?
Se yopu voglia di scrivere un blog, non esitate a farlo - ma non qui. –
@Neil: questa è una domanda concreta, il problema è con un ampio background che dovevo includere. È * utile *, ad esempio la risposta di James Hopkin, che le operazioni simili a memcopy() non sono state apportate alla bozza. In quale altro modo potrei chiedere di questo? Senza lo sfondo? Nessuno capirà! –
Forse sarebbe stato meglio chiedere come "Quali sono i vantaggi di unique_ptr". Puoi sempre rispondere alla tua domanda. –