gtk_widget_destroy GtkFileChooserDialog 导致分段错误
gtk_widget_destroy on GtkFileChooserDialog results in segmentation fault
我的第一个 GTK+ 应用程序有问题。我试图实现保存到 XML 文件。它像它应该的那样工作,但有时,程序在 gtk_widget_destroy(save_dialog) 处崩溃并出现分段错误。我真的不知道为什么会这样。
希望有人能帮帮我。
函数代码:
static void save_file_from_source_view(gboolean is_save_as)
{
GtkTextIter start, end;
char *text_content;
gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(text_editor_buffer), &start);
gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(text_editor_buffer), &end);
text_content = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(text_editor_buffer), &start, &end, FALSE);
if(is_save_as||last_filename==NULL)
{
GtkWidget *save_dialog;
gint result;
save_dialog = gtk_file_chooser_dialog_new("Save File", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL);
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(save_dialog), TRUE);
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog), last_filename!=NULL? last_filename:"untitled.xml");
result = gtk_dialog_run(GTK_DIALOG(save_dialog));
if(result == GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_dialog));
save_file(filename, text_content);
g_free(last_filename);
last_filename = malloc(sizeof(filename));
g_print("Got here 1\n");
strcpy(last_filename, filename);
g_print("Got here 2\n");
g_free(filename);
g_print("Got here 3\n");
}
g_print("Got here 4\n");
gtk_widget_destroy(save_dialog); // Crashes here
g_print("Got here 5\n");
}
else
{
save_file(last_filename, text_content);
}
}
输出:
Got here 1
Got here 2
Got here 3
Got here 4
Segemntation fault (core dumped)
确定你想要字符串的长度:
last_filename = malloc(strlen(filename) + 1);
而不是指向 char
的指针的大小(就像您所做的那样):
last_filename = malloc(sizeof(filename));
不要忘记在最后调用 free(last_filename)
以避免内存泄漏。
我的第一个 GTK+ 应用程序有问题。我试图实现保存到 XML 文件。它像它应该的那样工作,但有时,程序在 gtk_widget_destroy(save_dialog) 处崩溃并出现分段错误。我真的不知道为什么会这样。
希望有人能帮帮我。
函数代码:
static void save_file_from_source_view(gboolean is_save_as)
{
GtkTextIter start, end;
char *text_content;
gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(text_editor_buffer), &start);
gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(text_editor_buffer), &end);
text_content = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(text_editor_buffer), &start, &end, FALSE);
if(is_save_as||last_filename==NULL)
{
GtkWidget *save_dialog;
gint result;
save_dialog = gtk_file_chooser_dialog_new("Save File", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, "Cancel", GTK_RESPONSE_CANCEL, "Save", GTK_RESPONSE_ACCEPT, NULL);
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(save_dialog), TRUE);
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog), last_filename!=NULL? last_filename:"untitled.xml");
result = gtk_dialog_run(GTK_DIALOG(save_dialog));
if(result == GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_dialog));
save_file(filename, text_content);
g_free(last_filename);
last_filename = malloc(sizeof(filename));
g_print("Got here 1\n");
strcpy(last_filename, filename);
g_print("Got here 2\n");
g_free(filename);
g_print("Got here 3\n");
}
g_print("Got here 4\n");
gtk_widget_destroy(save_dialog); // Crashes here
g_print("Got here 5\n");
}
else
{
save_file(last_filename, text_content);
}
}
输出:
Got here 1
Got here 2
Got here 3
Got here 4
Segemntation fault (core dumped)
确定你想要字符串的长度:
last_filename = malloc(strlen(filename) + 1);
而不是指向 char
的指针的大小(就像您所做的那样):
last_filename = malloc(sizeof(filename));
不要忘记在最后调用 free(last_filename)
以避免内存泄漏。