2010-09-22 1 views
0

может быть, это продолжение this нити,EXEC_BAD_ADDRESS

Программа компилируется без ошибок и предупреждений, но когда я запускаю его, а функция вызывается обработчик, я получаю EXEC_BAD_ADDRESS

void MainController::show_color_trackbars(int *h, int *s, int *v){ 
    String winName = "HSV Trackbars"; 
    namedWindow(winName, CV_WINDOW_AUTOSIZE); 

    std::map<String, void*> user_data_h; 
    user_data_h["Object"] = this; //this is a MainController object 
    user_data_h["h"] = h; 
    createTrackbar("trackbar_H", winName, h, 255, trackbar_handler, &user_data_h); 

}; 

void trackbar_handler(int value, void *user_data){//callback for the track bar 
    std::map <String, void*> *user_data_map; 
    user_data_map = reinterpret_cast<std::map<String, void *> *>(user_data); 

    MainController *controller; 
    controller = reinterpret_cast<MainController *>((*user_data_map)["Object"]); 

    int *var; 
    var = reinterpret_cast<int*> ((*user_data_map)["h"]); 

    //do something with controller and var 
}; 

Я Ошибочно что-то при кастинге? Я не могу придумать другую причину, по которой этот код терпит неудачу.

Заранее спасибо

+1

nacho4d: Я уже дал аналогичный ответ на ваш другой вопрос, касающийся этого, но вот ссылка на более подробный ответ о том, как делать обратные вызовы C с помощью 'void *' в качестве пользовательских данных из C++: http: // stackoverflow.com/questions/3725425/class-method-as-winapi-callback/3725440#3725440 – sbi

ответ

1

Это потому, что во всех user_data_h вероятность является локальной переменной и уже уничтожены, когда trackbar_handler называется. trackbar_handler работает над указателем, который больше не действителен!

Проверьте, нормально ли установлено user_data_h и зарегистрируйте этот указатель с отправкой обратного вызова.

+0

Я вижу. Но тогда я действительно не понимаю достоинства этой функции. Я считаю, что, как полагают, не используется в ООП. Причина. Если у меня должен быть указатель, который является действительным, это означает, что он должен быть глобальным или, по крайней мере, членом моего класса (поэтому я могу его позже выпустить). И если я это сделаю, тогда нет необходимости иметь параметр void * user_data в функции. Я прав? – nacho4d

+0

Да. Ты прав. – Chubsdad