Estoy haciendo un uso extensivo de boost:shared_ptr
en mi código. De hecho, la mayoría de los objetos que están asignados en el montón están en un shared_ptr
. Desafortunadamente, esto significa que no puedo pasar this
a ninguna función que tome shared_ptr
. Considere este código:Obteniendo un impulso :: shared_ptr para este
void bar(boost::shared_ptr<Foo> pFoo)
{
...
}
void Foo::someFunction()
{
bar(this);
}
Aquí hay dos problemas. Primero, esto no se compilará porque el constructor T * para shared_ptr
es explícito. En segundo lugar, si lo forzo a construir con bar(boost::shared_ptr<Foo>(this))
, he creado un segundo puntero compartido para mi objeto que eventualmente conducirá a una eliminación doble.
Esto me lleva a mi pregunta: ¿Hay algún patrón estándar para obtener una copia del puntero compartido existente que usted conoce que existe dentro de un método en uno de esos objetos? ¿El uso de referencia intrusiva es mi única opción aquí?
"_Is utilizando referencia intrusiva contando mi única opción aquí _ "¿Qué pasa con esta opción? – curiousguy
Quizás nada. Depende de tus circunstancias. Hace tus objetos más grandes y puede que no funcionen en lugares donde no tienes control sobre las clases a las que mandas a los smartpointers. –
enabe_shared_from_this ahora está en 'std ::'. Eche un vistazo a mi respuesta. –