2008-11-10 304 views
18

我有一段代碼看起來像這樣:什麼可能導致dynamic_cast崩潰?

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

有時它崩潰:

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 

我不知道爲什麼它崩潰。 obj不爲空(如果它不是問題,是嗎?)。

什麼可能是動態演員陣容崩潰的原因?

如果它不能轉換,它應該只返回NULL否?

回答

37

爲崩潰的一些可能的原因:

  • obj指向與非多態類型(類或結構沒有虛方法,或基本類型)的對象。
  • obj指向已釋放的對象。
  • obj點映射的內存或存儲器已在這樣的方式訪問時(例如,防護頁面或不可訪問的頁),以產生一個異常被映射。
  • obj指向具有多態類型的對象,但該類型是在禁用了RTTI的外部庫中定義的。

並非所有的這些問題,必然導致在所有情況下崩潰。

1

可以通過不同的線程更改obj的值嗎?

+0

好直覺!另一個線程釋放了'obj'。 – Barth 2008-11-11 07:39:54

2

如果轉換失敗並且您正在轉換爲指針(這是您的情況),dynamic_cast將返回0。問題在於你在代碼的早期損壞了堆,或者rtti沒有啓用。

2

您確定'obj'的值已被正確定義嗎?

如果例如它是未初始化的(即隨機),我可以看到它導致崩潰。

+0

的確,'obj'被另一個線程釋放了。感謝您的幫助 – Barth 2008-11-11 07:39:20

3

因爲它有時只是崩潰,我敢打賭這是一個線程問題。檢查所有對'obj'的引用:

grep -R 'obj.*=' .
11

我建議對此代碼段使用不同的語法。

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

您仍然可以崩潰,如果其他線程被刪除的內容monitorObject點,或者obj瘋狂的垃圾,但至少你的問題是不是鑄造了相關的,你沒有做的dynamic_cast的兩倍。

+1

確實,'obj'被另一個線程釋放,導致崩潰。謝謝你的幫助 ! – Barth 2008-11-11 07:38:25