Pergunta

Eu tenho um pedaço de código parecido com isto:

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

Às vezes ele trava:

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

Eu não tenho idéia por que ele trava. obj não é nulo (e se fosse, não seria um problema, não é?).

O que poderia ser a razão para um elenco dinâmico para acidente?

Se não pode lançar, ele deve apenas NULL não voltará?

Foi útil?

Solução

Algumas possíveis razões para o acidente:

  • obj aponta para um objecto com um tipo não-polimórficos (uma classe ou estrutura sem métodos virtuais, ou um tipo fundamental).
  • obj aponta para um objeto que foi libertado.
  • obj aponta para memória não mapeada, ou memória que tenha sido mapeados na forma de um ponto de gerar uma exceção quando acessado (como uma página de proteção ou página inacessível).
  • obj aponta para um objeto com um tipo polimórfico, mas que tipo foi definido em uma biblioteca externa que foi compilado com RTTI desativado.

Nem todos esses problemas causam necessariamente um acidente em todas as situações.

Outras dicas

Eu sugiro usar uma sintaxe diferente para este trecho de código.

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

Você ainda pode falhar se algum outro segmento é apagar o que pontos monitorObject ou se obj é lixo louco, mas pelo menos o seu problema não está lançando relacionado mais e você não está fazendo o dynamic_cast duas vezes.

Como ele trava só às vezes, eu aposto que é um problema de segmentação. Confira todas as referências a 'obj':

grep -R 'obj.*=' .

dynamic_cast irá retornar 0 se a conversão falhar e você está lançando para um ponteiro, que é o seu caso. O problema é que você quer ter corrompido a pilha anteriormente em seu código, ou rtti não foi ativado.

Você tem certeza que o valor de 'obj' foi correctamente definido?

Se, por exemplo, é uninitialised (isto é aleatório) a eles que eu poderia vê-lo causando um acidente.

Pode o valor de obj ser alterado por um thread diferente?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top