2008-11-10 5 views
18

Ich habe ein Stück Code wie folgt aussehen:Was könnte einen dynamischen_cast zum Absturz bringen?

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

Manchmal stürzt:

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 

Ich habe keine Ahnung, warum es abstürzt. obj ist nicht null (und wenn es wäre, wäre es kein Problem, oder?).

Was könnte der Grund dafür sein, dass ein dynamischer Cast abstürzt?

Wenn es nicht werfen kann, sollte es nur NULL Nein zurückgeben?

Antwort

37

Mögliche Gründe für den Absturz:

  • obj auf ein Objekt mit einem nicht-polymorphen Typ (einer Klasse oder Struktur ohne virtuelle Methoden oder einen grundlegenden Typ).
  • obj verweist auf ein Objekt, das freigegeben wurde.
  • obj verweist auf nicht zugeordneten Speicher oder Speicher, der so zugeordnet wurde, dass beim Zugriff eine Ausnahme generiert wird (z. B. eine Schutzseite oder eine nicht zugreifbare Seite).
  • obj verweist auf ein Objekt mit einem polymorphen Typ, aber dieser Typ wurde in einer externen Bibliothek definiert, die mit deaktivierter RTTI kompiliert wurde.

Nicht alle dieser Probleme verursachen in allen Situationen einen Absturz.

1

Kann der Wert von obj durch einen anderen Thread geändert werden?

+0

Gute Intuition! Ein weiterer Thread löste 'obj'. – Barth

2

dynamic_cast gibt 0 zurück, wenn die Umwandlung fehlschlägt und Sie auf einen Zeiger werfen, was in Ihrem Fall der Fall ist. Das Problem besteht darin, dass Sie den Heap früher in Ihrem Code beschädigt haben oder rtti nicht aktiviert war.

2

Sind Sie sicher, dass der Wert von 'obj' korrekt definiert wurde?

Wenn es zum Beispiel nicht initialisiert (dh zufällig) ist, könnte ich sehen, dass es einen Absturz verursacht.

+0

Tatsächlich wurde 'obj' von einem anderen Thread freigegeben. Danke für Ihre Hilfe – Barth

3

Da es nur manchmal abstürzt, ich wette, es ist ein Threading-Problem. Überprüfen Sie alle Verweise auf 'obj':

grep -R 'obj.*=' .
11

Ich empfehle eine andere Syntax für dieses Code-Snippet.

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

Sie können immer noch abstürzen, wenn ein anderer Thread zu löschen, was monitorObject Punkte oder wenn obj ist verrückt Müll, aber zumindest Ihr Problem Casting ist nicht im Zusammenhang mehr und du bist nicht die dynamic_cast zweimal tun.

+1

Tatsächlich wurde 'obj' von einem anderen Thread freigegeben und dies verursachte den Absturz. Danke für Ihre Hilfe ! – Barth

Verwandte Themen