Después de pasar los últimos días depurando un subproceso múltiple donde un subproceso eliminaba un objeto que todavía estaba en uso por otro, me di cuenta de que el problema habría sido mucho más fácil y rápido de diagnosticar si hubiera podido hacer que 'esto' fuera volátil. Habría cambiado el volcado de emergencia en el sistema (sistema operativo Symbian) a algo mucho más informativo.¿Por qué 'esto' no es volátil?
Entonces, ¿hay alguna razón por la cual no puede ser o no debería ser?
Edit: Así que realmente no hay una manera segura de prevenir o verificar este escenario. ¿Sería correcto decir que una solución para acceder a punteros de clase obsoleta es tener una variable global que contenga el puntero, y las funciones que se llamen deberían ser estáticas que usen la variable global como reemplazo de 'esto'?
static TAny* gGlobalPointer = NULL;
#define Harness static_cast<CSomeClass*>(gGlobalPointer);
class CSomeClass : public CBase
{
public:
static void DoSomething();
private:
int iMember;
};
void CSomeClass::DoSomething()
{
if (!Harness)
{
return;
}
Harness->iMember = 0;
}
Por lo tanto, si se eliminara otro subproceso y NULL el puntero global, se detectaría inmediatamente.
Una cuestión que creo que con esto es que si el compilador guardó en caché el valor de arnés en lugar de comprobarlo cada vez que se utiliza.
¿Quiere decir que habría sido más fácil si 'this' fuera volátil, o que hubiera sido más fácil si' this' fuera un puntero a volátil? En otras palabras, ¿veías en el volcado de emergencia un valor desactualizado de 'this' (que parece un poco extraño ya que nunca cambia), o de algún miembro de datos? –