Ho un progetto che mi piacerebbe utilizzare maggiormente i puntatori intelligenti. Nel complesso, ho avuto successo in questo obiettivo. Tuttavia, mi sono imbattuto in una cosa che non sono sicuro di quale sia la "migliore pratica".restituire un "puntatore" che deve essere tenuto da un puntatore intelligente
Fondamentalmente vorrei restituire un "puntatore" da una funzione, ma richiede che l'utente lo tenga in un puntatore intelligente. Non solo, non voglio mandare un particolare puntatore intelligente (condiviso o ambito).
Il problema è principalmente che non sembra esserci un modo corretto per aggiornare un scoped_ptr
a un shared_ptr
(sarebbe la soluzione ideale che penso). Capisco perché non hanno fatto questo, in quanto consentirebbe il trasferimento della proprietà che può portare ad alcuni problemi come quelli che hanno std::auto_ptr
.
Tuttavia, il trasferimento di proprietà sembra una buona idea per questo caso. Quindi la mia idea è simile a questo:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
questo funziona "ok" in quanto entrambi scoped_ptr
e shared_ptr
avere costruttori che prendono possesso di un std::auto_ptr
.
Quindi la mia domanda è: questa è una buona pratica? C'è una soluzione migliore? L'unica vera alternativa sono stato in grado di elaborare con sta utilizzando un template come valore restituito in questo modo:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
che in realtà potrebbe funzionare bene, tranne che penso che sarebbe bisogno di qualche lavoro per farlo funziona anche con un scoped_ptr
.
Pensieri?
shared_ptr nel build a thread singolo non utilizza il conteggio di riferimento atomico. –
Hai ragione, ma per impostazione predefinita la spinta è generata nella versione multi-thread. – Artyom
Il vantaggio dell'uso di scoped_ptr su auto_ptr è quando si desidera rendere chiaro che non si suppone di copiare il puntatore. Semplicemente non puoi con scoped_ptr. Si tratta di trasmettere le tue intenzioni, proprio come il tuo esempio con auto_ptr e il trasferimento di proprietà. –