2014-11-20 81 views
1

在以下C++代碼,我試圖從共享庫加載函數。Segfault轉換指針與reinterpret_cast

void* tmp = dlsym(dl_lib, symbol); 
_fun = reinterpret_cast<plot_sample_fun*>(tmp); 

但是,在轉換指針時reinterpret_cast段錯誤。這裏有什麼問題?

編輯:

爲了提供進一步的上下文中,

typedef void plot_sample_fun(const void *, double **, char ***, size_t *); 

class Foo { 
    void bar(); // Loads _fun as above. 

    plot_sample_fun* _fun; 
}; 
+1

您可以閱讀http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to-whatever – chrizke 2014-11-20 19:02:42

+3

什麼是_fun? reinterpret_cast不會自行執行例外。它只會迫使編譯器相信指針是某種類型的。但是,段錯誤是關於將指針存儲在其他一些內存位置。 – AlexanderVX 2014-11-20 19:06:34

+1

它確實是segfaults的'reinterpret_cast',而不是以後使用的指針?爲什麼你不檢查它不是null? – 2014-11-20 19:09:18

回答

2

指針物理上只是一個包含某個地址的整型變量。

reinterpret_cast只是讓編譯器相信指針是特定類型的技巧。

在上面的代碼示例中,段錯誤的唯一可能性是第一行,但作者說第二行,或者第二行,原因是_fun是某種懸掛引用,因此它寫入不正確的內存位置。

筆者更新我們的指針類型後,它更清楚正確的代碼應該是這樣的:

typedef void (plot_sample_fun*)(const void *, double **, char ***, size_t *); 

而且分配:

_fun = reinterpret_cast<plot_sample_fun>(tmp); 

和類成員聲明不應該有星號*

plot_sample_fun _fun; 

如果這沒有幫助,那麼我們想知道是否實例o包含_fun的f類已正確分配,尚未發佈。

+0

你的後一種解釋很有希望,但我怎樣才能解決這個懸而未決的參考?我用更多的上下文更新了我的問題。 – ehuang 2014-11-20 23:45:28

+0

Eric,請讓我們知道_fun變量是什麼。 – AlexanderVX 2014-11-20 23:46:17

+0

它是typedef plot_sample_fun中的類型。 – ehuang 2014-11-20 23:48:07

2

reinterpret_cast本身不能段錯誤,因爲它僅改變用於編譯器的表達式的類型。 它被編譯掉並且在運行時上不做任何事情(不像例如dynamic_cast)。

什麼是失敗是您在程序中稍後使用指針。

與static_cast不同,但像const_cast會,使用reinterpret_cast表達不編譯任何CPU指令

我建議編譯與調試的程序中關閉on(-g with gcc/clang),然後在調試器中運行它,查看實際失敗的內容。