Frage

Ich habe ein Stück Code wie folgt aussehen:

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 es wäre kein Problem sein, oder?).

Was ist der Grund für eine dynamische Umwandlung könnte zum Absturz?

Wenn es nicht werfen kann, sollte es nur geben NULL zurück, nicht wahr?

War es hilfreich?

Lösung

Einige 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 auf ein Objekt, das befreit wurde.
  • obj Punkte auf unmapped Speicher oder Speicher, der in einer solchen Art und Weise kartiert wurde eine Ausnahme zu erzeugen, wenn zugegriffen wird (wie zum Beispiel eine Schutzseite oder unzugänglichen Seite).
  • obj auf ein Objekt mit einem polymorphen Typ, aber dieser Typ wurde in einer externen Bibliothek definiert, die mit RTTI deaktiviert kompiliert wurden.

Nicht alle diese Probleme verursachen zwangsläufig einen Absturz in allen Situationen.

Andere Tipps

Ich schlage vor, eine andere Syntax für diesen Codeausschnitt verwendet wird.

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 das Problem des Gießens mehr nicht und Sie sind nicht die dynamic_cast zweimal tun.

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

grep -R 'obj.*=' .

dynamic_cast 0 zurück, wenn die Umwandlung fehlschlägt und Sie auf einen Zeiger werfen, was der Fall ist. Das Problem ist, dass Sie entweder den Haufen früher im Code beschädigt oder rtti wurde nicht aktiviert.

Sind Sie sicher, dass der Wert von ‚obj‘ richtig definiert wurde?

Wenn zum Beispiel ist uninitialised (dh zufällig) sie, dass ich es sehen konnte einen Absturz verursachen.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top