Pregunta

Tengo un código que se ve así:

TAxis *axis = 0;
if (dynamic_cast<MonitorObjectH1C*>(obj))
   axis = (dynamic_cast<MonitorObjectH1C*>(obj))->GetXaxis();

A veces se bloquea:

Thread 1 (Thread -1208658240 (LWP 11400)):
#0  0x0019e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x048c67fb in __waitpid_nocancel () from /lib/tls/libc.so.6
#2  0x04870649 in do_system () from /lib/tls/libc.so.6
#3  0x048709c1 in system () from /lib/tls/libc.so.6
#4  0x001848bd in system () from /lib/tls/libpthread.so.0
#5  0x0117a5bb in TUnixSystem::Exec () from /opt/root/lib/libCore.so.5.21
#6  0x01180045 in TUnixSystem::StackTrace () from /opt/root/lib/libCore.so.5.21
#7  0x0117cc8a in TUnixSystem::DispatchSignals ()
   from /opt/root/lib/libCore.so.5.21
#8  0x0117cd18 in SigHandler () from /opt/root/lib/libCore.so.5.21
#9  0x0117bf5d in sighandler () from /opt/root/lib/libCore.so.5.21
#10 <signal handler called>
#11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

No tengo idea de por qué se bloquea. obj no es nulo (y si lo fuera no sería un problema, ¿verdad?).

¿Cuál podría ser la razón por la que un elenco dinámico falla?

Si no puede lanzar, debería devolver NULL no?

¿Fue útil?

Solución

Algunas posibles razones del bloqueo:

  • obj apunta a un objeto con un tipo no polimórfico (una clase o estructura sin métodos virtuales, o un tipo fundamental).
  • obj apunta a un objeto que ha sido liberado.
  • obj apunta a memoria no asignada, o memoria que ha sido asignada de tal manera que genera una excepción cuando se accede (como una página de protección o una página inaccesible).
  • obj apunta a un objeto con un tipo polimórfico, pero ese tipo se definió en una biblioteca externa que se compiló con RTTI deshabilitado.

No todos estos problemas necesariamente provocan un bloqueo en todas las situaciones.

Otros consejos

Sugiero usar una sintaxis diferente para este fragmento de código.

if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
    axis = monitorObject->GetXaxis();
}

Todavía puede bloquearse si algún otro hilo está eliminando lo que señala monitorObject o si obj es una basura loca, pero al menos su problema ya no está relacionado con la transmisión y no está haciendo el dynamic_cast dos veces.

Como a veces se bloquea, apuesto a que es un problema de subprocesos. Verifique todas las referencias a 'obj':

grep -R 'obj.*=' .

dynamic_cast devolverá 0 si el lanzamiento falla y está lanzando a un puntero, que es su caso. El problema es que ha dañado el montón anteriormente en su código o rtti no estaba habilitado.

¿Está seguro de que el valor de 'obj' se ha definido correctamente?

Si, por ejemplo, no se inicializa (es decir, es aleatorio), podría ver que causa un bloqueo.

¿Se puede cambiar el valor de obj por un hilo diferente?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top