Strona 1 z 1

malloc struktury i segmentation fault

: 04 marca 2010, 11:09
autor: szuwar7
Mam taki mały problem. Używam malloca w ,,main'' w ten sposób:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

read_conf_file(widgets);
struktura MyWidgets

Kod: Zaznacz cały

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

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

 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?

: 04 marca 2010, 13:11
autor: mlyczek
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

Kod: Zaznacz cały

        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.

: 09 marca 2010, 08:50
autor: szuwar7
Probowalem tego tez, ale dalej nie dziala. Napisalem juz ten program bez malloca, ale ciekawe skad ten blad.

: 10 marca 2010, 15:37
autor: godlark
Zainteresuj się programem valgrind, uruchamiasz go "valgrind nazwa_programu", wskazuje wycieki pamięci. Tylko najpierw skompiluj program z opcją -ggdb.