|
malloc struktury i segmentation fault
szuwar7 - 04-03-2010 11:09
Mam taki mały problem. Używam malloca w ,,main'' w ten sposób:
MyWidgets *widgets; widgets = g_slice_new (MyWidgets);
widgets->settings=g_malloc(sizeof(SSH_Settings)); widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256);
Później chcę użyć free i jeszcze raz malloca w funkcji:
void *read_conf_file(void *args) { MyWidgets *widgets; widgets = (MyWidgets *)args;
g_free(widgets->settings); g_free(widgets->settings->id_rsa_dir);
widgets->settings=g_malloc(sizeof(SSH_Settings)); widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256); }
Wywołanie funkcji read_conf_file w main:
read_conf_file(widgets);
struktura MyWidgets
typedef struct { GladeXML *gxml; GtkWidget *window2; GtkWidget *window; GtkWidget *entry; GtkWidget *setting_entry_id_rsa; GtkWidget *setting_entry_login; GtkWidget *setting_entry_ssh_config; GtkWidget *textview; GtkWidget *radio1; GtkWidget *radio2; GtkWidget *radio3; GtkWidget *radio4; GtkWidget *radio5; GtkWidget *radio6; GtkWidget *toggle1; GtkWidget *toggle2; GtkWidget *toggle3; GtkWidget *toggle4; GtkWidget *toggle5; GtkWidget *toggle6; GtkWidget *toggleButton; GtkWidget *progress_bar; GtkWidget *connection; SSH_Settings *settings; gchar *filename; GError *error; } MyWidgets;
struktura SSH_Setting
typedef struct { gchar *id_rsa_dir; gchar *login; gchar *ssh_config_dir;
} SSH_Settings;
Podczas wywołania malloca po raz pierwszy w main wszystko działa jak należy. Gdy wywołuje funkcję read_conf_file funkcje free i malloc dla struktury SSH_Settings nie powoduje błędu. Dopiero ta linijka:
widgets->settings->id_rsa_dir=(gchar*)g_malloc(sizeof(gchar)*256);
Powoduje powstanie błędu segmentation fault. Jak temu zaradzić? Skąd bierze się ten akurat przy tym wywołaniu?
mlyczek - 04-03-2010 13:11
Nie mam pomysłu na to, czemu akurat podana przez Ciebie linjka powoduje błąd, ale spróbuj na początek może w funkcji read_conf_file zamienić poniższe dwie linijki miejscami g_free(widgets->settings); g_free(widgets->settings->id_rsa_dir);
bo najpierw zwalniasz pamięć, w której jest cała struktura settings, a potem chcesz zwolnić pamięć wskazywaną przez element tej struktury (konkretnie przez settings->id_rsa_dir), ale tego wskaźnika już tam nie ma. W zasadzie to właśnie ta linijka powinna spowodować błąd.
Spróbuj je zamienić miejscami, może to coś pomoże.
szuwar7 - 09-03-2010 08:50
Probowalem tego tez, ale dalej nie dziala. Napisalem juz ten program bez malloca, ale ciekawe skad ten blad.
godlark - 10-03-2010 15:37
Zainteresuj się programem valgrind, uruchamiasz go "valgrind nazwa_programu", wskazuje wycieki pamięci. Tylko najpierw skompiluj program z opcją -ggdb.
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|