Tengo un proyecto que me gustaría hacer un mayor uso de punteros inteligentes. En general, he tenido éxito en este objetivo. Sin embargo, me he encontrado con algunas cosas que no estoy seguro de cuál es la "mejor práctica".devolviendo un 'puntero' que se requiere para ser sostenido por un puntero inteligente
Básicamente me gustaría devolver un "puntero" de una función, pero requiere que el usuario lo mantenga en un puntero inteligente. No solo eso, no quiero ordenar un puntero inteligente en particular (compartido versus ámbito).
El problema es principalmente que no parece haber una forma adecuada de actualizar un scoped_ptr
a un shared_ptr
(esa sería la solución ideal, creo). Entiendo por qué no hicieron esto, ya que permitiría la transferencia de propiedad, lo que puede dar lugar a algunos problemas como los que tiene std::auto_ptr
.
Sin embargo, la transferencia de propiedad parece una buena idea para esta caja. Así que mi idea es la siguiente:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
esto funciona "ok" ya que ambos scoped_ptr
y shared_ptr
tienen constructores que tienen la propiedad de un std::auto_ptr
.
Así que mi pregunta es, ¿es esta una buena práctica? ¿Hay una mejor solución? La única alternativa real que hemos sido capaces de llegar a es el uso de una plantilla de plantilla como el valor de retorno de esta manera:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
que en realidad podría funcionar bien, excepto que creo que sería necesario algún trabajo para conseguir que se trabaje con un scoped_ptr
también.
¿Pensamientos?
shared_ptr en la compilación de subprocesos individuales no utiliza recuento de referencias atómicas. –
Tiene razón, pero por defecto boost es construir en versión multihilo. – Artyom
La ventaja de utilizar scoped_ptr sobre auto_ptr es cuando desea dejar en claro que no debe copiar el puntero. Simplemente no puedes con scoped_ptr. Se trata de transmitir sus intenciones, al igual que su ejemplo lo hace con auto_ptr y transferencia de propiedad. –