Mam sobie klasę Filter (nieważne co to robi), pobiera dane z pliku, między innymi informacje o typie. Ustaliłem sobie, że dodatni typ całkowitoliczbowy odpowiadający typowi unsigned będę zapisywał w pliku jako unsigned_int. Chciałem wypróbować obsługę błędów. Jeśli jest błędny typ w pliku, to ma się wyświetlać proste okienko z informacją o błędzie.
Obsługa tego wygląda tak:
try
{
//pobieranie informacji z pliku
}
catch (FilterExceptions::InvalidParameterTypeInFile &exc)
{
ModalInformation dialog(GTKUtilities::ERROR) ;
REPORT_VAR(exc.what()) ; //linia 300
dialog.setInformation(exc.what()) ;
REPORT_VAR(exc.what()) ; //linia 302
dialog.setTitle("Niepoprawny typ filtru") ;
dialog.run() ;
}
FilterExceptions::InvalidParameterTypeInFile to klasa wyjątku, dziedziczy po std::exception
makra REPORT_VAR służą do zapisywania wartości zmiennych.
metody setInformation() i run() wyglądają tak:
void ModalInformation::setInformation(const char* information)
{
REPORTER_F_THR(rep) ;
message = information ;
REPORT_VAR(information) ; //linia 15
REPORT_VAR(message) ; //linia 16
}
void ModalInformation::run()
{
REPORTER_F_THR(rep) ;
REPORT_VAR(message) ; //linia 33
GtkWidget *dialog = gtk_message_dialog_new(
NULL,
GTK_DIALOG_MODAL,
static_cast<GtkMessageType>(type),
GTK_BUTTONS_OK,
"%s", message.c_str()
) ;
REPORT_VAR(message) ; //linia 41
gtk_window_set_title(GTK_WINDOW(dialog), title.c_str()) ;
gtk_dialog_run(GTK_DIALOG(dialog)) ;
gtk_widget_destroy(dialog) ;
}
ModalInformation::message jest polem klasy typu std::string
niby ok. nigdzie po drodze NIE SĄ niszczone obiekty przetrzymujące te zmienne.
log:
exc.what() == Invalid type: unsigned. line 300 in filterSignal(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp
information == Invalid type: unsign( line 15 in setInformation(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_my_dialogs.cpp
message == Invalid type: unsign( line 16 in setInformation(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_my_dialogs.cpp
exc.what() == Invalid type: unsigned. line 302 in filterSignal(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp
message == Invalid type: unsign( line 33 in run(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_my_dialogs.cpp
message == Invalid type: unsign( line 41 in run(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_my_dialogs.cpp
czemu do k. nędzy wywołanie exc.what() zwraca poprawną informację, a przekazane do settera zmiennej message już ulega uszkodzeniu??