Question

J'ai un morceau de code ressemblant à ceci:

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

Parfois, il se bloque:

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

Je ne sais pas pourquoi cela se bloque. obj n'est pas null (et si c'était le cas, cela ne poserait pas de problème, le serait-il?).

Quelle peut être la raison pour laquelle un casting dynamique se bloque?

S'il ne peut pas lancer le film, il devrait simplement renvoyer NULL non?

Était-ce utile?

La solution

Quelques raisons possibles du crash:

  • obj pointe sur un objet avec un type non polymorphe (une classe ou une structure sans méthodes virtuelles ou un type fondamental).
  • obj pointe sur un objet qui a été libéré. ??
  • obj désigne une mémoire non mappée ou mappée de manière à générer une exception lors de l'accès (telle qu'une page de garde ou une page inaccessible).
  • obj pointe sur un objet de type polymorphe, mais ce type a été défini dans une bibliothèque externe compilée avec RTTI désactivé.

Tous ces problèmes ne provoquent pas nécessairement un blocage dans toutes les situations.

Autres conseils

Je suggère d'utiliser une syntaxe différente pour cet extrait de code.

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

Vous pouvez toujours planter si un autre thread supprime ce que monitorObject pointe vers ou si obj est une foutaise, mais au moins votre problème n'est plus lié à la diffusion et vous ne faites pas le dynamic_cast deux fois.

Comme il ne se bloque que parfois, je parie que c'est un problème de thread. Vérifiez toutes les références à 'obj':

grep -R 'obj.*=' .

dynamic_cast retournera 0 si la distribution échoue et que vous convertissez un pointeur, ce qui est votre cas. Le problème est que vous avez corrompu le tas plus tôt dans votre code ou que rtti n’est pas activé.

Êtes-vous sûr que la valeur de 'obj' a été correctement définie?

Si, par exemple, il est non initialisé (c'est-à-dire aléatoire), je pourrais le voir causer un crash.

La valeur de obj peut-elle être modifiée par un autre thread?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top