2014-11-20 3 views
1

В следующем C++ коде, я пытаюсь загрузить функцию из общей библиотеки.Указатели преобразования segfault с reinterpret_cast

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

Однако reinterpret_cast ошибку сегментации при преобразовании указателей. Что здесь не так?

Edit:

Для обеспечения дальнейшего контекста,

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

+3

Что такое _fun? То, что reinterpret_cast не делает исключение само по себе. Это только заставляет компилятор полагать, что указатель имеет какой-то тип. Но это segfault - это сохранение указателя в другом месте памяти. – AlexanderVX

+1

Действительно ли это 'reinterpret_cast', что segfaults, а не более поздняя версия указателя? И почему вы не проверяете, что это не null? –

ответ

2

Указатель физически представляет собой целочисленную переменную, содержащую некоторый адрес.

Reinterpret_cast - всего лишь трюк, чтобы заставить компилятор считать, что указатель имеет определенный тип.

В примере кода выше единственной возможности segfault в первой строке, но автор говорит второй, или во второй строке, и причина в том, что _fun - это какая-то болтливая ссылка, поэтому она записывает неправильную ячейку памяти.

После того, как автор обновил нас на тип указателя является более ясным, что правильный код должен выглядеть следующим образом:

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

Также назначение:

_fun = reinterpret_cast<plot_sample_fun>(tmp); 

И заявление члена класса не должны иметь asterisk *

plot_sample_fun _fun; 

И если это не помогает, то мы задаемся вопросом, является ли экземпляр o f, который содержит _fun, правильно распределен и еще не выпущен.

+0

Ваше последнее объяснение многообещающее, но как я могу исправить эту болтающуюся ссылку? Я обновил свой вопрос с большим контекстом. – ehuang

+0

Эрик, пожалуйста, сообщите нам, что такое переменная _fun. – AlexanderVX

+0

Это тип в typedef plot_sample_fun. – ehuang

2

reinterpret_cast сам не может сегментации, поскольку она изменяет только тип выражения для компилятора. Он скомпилирован и ничего не делает во время выполнения (в отличие от, например, dynamic_cast).

Что происходит, если вы используете указатель позже в программе.

В отличии от static_cast, но как const_cast, выражения reinterpret_cast не компилировать какие-либо инструкции процессора

Я рекомендую компиляцию программы с отладкой (-g с gcc/clang), а затем запустить его в отладчике, чтобы увидеть, что на самом деле происходит с ошибкой.

Смежные вопросы