2013-12-10 58 views
2

我的代碼是這樣的:的reinterpret_cast作爲dynamic_cast的

void some_func(void *source) 
{ 
    ... 
    double *casted = reinterpret_cast<double *>(source); 
    ... 
} 

這將導致std::__non_rtti_object例外。根據堆棧跟蹤,它從__RTDynamicCast提出,這是(據我所知)MSVC執行dynamic_cast。

這個異常應該發生在dynamic_cast上,因爲指針來自外部庫(可能編譯時沒有/ GR)並且指向具有多個雙精度的結構。但我不希望這與reinterpret_cast。它不應該只是改變指針的類型,根本沒有任何檢查?

注:

  • 我的編譯器是msvc120(MS的Visual Studio 2013)
  • 項目與/ GR(啓用運行時類型信息)
  • 指針 「源」 編譯來自外部庫(編譯可能不帶/ GR)
  • 我也具有相同的結果
+3

似乎很奇怪,RTTI不應該影響'reinterpret_cast'。舊式C劇組會發生什麼(例如'(double *)source')? –

+1

即使[這個問題](http://stackoverflow.com/questions/5582874/dynamic-cast-throws-pointer-is-not-std-non-rtti-object)處理從'dynamic_cast拋出的異常',OP的回答說問題是指針是'nullptr'。你確定'source!= nullptr'? – Praetorian

+5

我不相信你已經向我們展示了足夠的代碼來確定問題。這看起來對我來說完全有效,即使你在投射一個空指針。 –

回答

0

非重複性的static_cast嘗試。

嗯,我試圖重建整個項目與所有其他庫和 問題消失。似乎很奇怪,因爲我從來沒有使用過dynamic_cast的代碼 ,所以不知道是什麼造成了這種情況。此外,我已經 試圖只重建該項目(沒有其他DLL)之前。 無論如何,謝謝你的幫助。 - OP

0

這似乎是你需要重新檢查你的編譯文件的dll的順序(如果使用這樣的)。我想你提到的外部庫的源代碼來自外部庫,它比構建樹中的「更高」而不是你的代碼所在的庫。試着看看你的makefile是否正常工作(也許會漏掉一些觸發器)。