Domanda

Ho un pezzo di codice simile a questo:

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

A volte si arresta in modo anomalo:

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

Non ho idea del perché si blocchi. obj non è nullo (e se non lo fosse non sarebbe un problema, vero?).

Quale potrebbe essere la ragione per cui un cast dinamico si arresta in modo anomalo?

Se non riesce a trasmettere, dovrebbe semplicemente restituire NULL no?

È stato utile?

Soluzione

Alcuni possibili motivi del crash:

  • obj punta a un oggetto con un tipo non polimorfico (una classe o struttura senza metodi virtuali o un tipo fondamentale).
  • obj punta a un oggetto che è stato liberato.
  • obj punta alla memoria non mappata o alla memoria che è stata mappata in modo tale da generare un'eccezione quando vi si accede (come una pagina di guardia o una pagina inaccessibile).
  • obj punta a un oggetto con un tipo polimorfico, ma quel tipo è stato definito in una libreria esterna che è stata compilata con RTTI disabilitato.

Non tutti questi problemi causano necessariamente un arresto anomalo in tutte le situazioni.

Altri suggerimenti

Suggerisco di usare una sintassi diversa per questo frammento di codice.

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

Puoi comunque andare in crash se qualche altro thread sta eliminando ciò a cui monitorObject punta o se obj è spazzatura pazza, ma almeno il tuo problema non è più relativo al casting e non stai eseguendo il Dynamic_cast due volte.

Dato che si blocca solo a volte, scommetto che è un problema di threading. Controlla tutti i riferimenti a "obj":

grep -R 'obj.*=' .

dynamic_cast restituirà 0 se il cast fallisce e stai lanciando un puntatore, nel tuo caso. Il problema è che hai danneggiato l'heap in precedenza nel tuo codice o che rtti non era abilitato.

Sei sicuro che il valore di 'obj' sia stato definito correttamente?

Se ad esempio non è inizializzato (cioè casuale), potrei vederlo causare un arresto anomalo.

Il valore di obj può essere modificato da un thread diverso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top