GTK+/C报错:gtk_entry_get_text断言失败问题求助
问题根源
你遇到的断言错误,核心原因是**DialogStruct对象的生命周期不匹配**:
- 在
GetAnswer函数里,DialogStruct dialogData是栈上的局部变量,函数执行完成返回后,这块内存会被系统回收。 - 对话框的按钮回调函数
OkButtonClicked还持有这个结构体的指针,但此时指针指向的内存已经无效,dialogData->dialogEntry变成了野指针,GTK的类型检查断言自然会失败。
解决方案
1. 动态分配DialogStruct内存
把栈上的局部结构体换成堆内存分配,确保在回调函数执行前内存不会被释放:
修改GetAnswer中的代码:
if (xFlag) { g_print("\nFound \"x\"\n"); // 改用g_malloc动态分配结构体,内存不会随函数返回释放 DialogStruct *dialogData = g_malloc(sizeof(DialogStruct)); CreateDialogWindow(globalData, dialogData); }
2. 修复回调函数,区分OK/Cancel并释放内存
修改OkButtonClicked,区分按钮类型,处理完后销毁对话框并释放结构体内存:
void OkButtonClicked(GtkWidget *button, gpointer data) { DialogStruct *dialogData = (DialogStruct *)data; GtkWidget *dialogWindow = gtk_widget_get_toplevel(dialogData->dialogEntry); const gchar *buttonLabel = gtk_button_get_label(GTK_BUTTON(button)); if (!g_strcmp0(buttonLabel, "OK")) { const gchar *entryText = gtk_entry_get_text(GTK_ENTRY(dialogData->dialogEntry)); g_print("Entry Content: %s\n", entryText); // 这里可以添加x值的后续处理逻辑,比如替换表达式中的x并计算结果 } // 销毁对话框并释放结构体内存 gtk_widget_destroy(dialogWindow); g_free(dialogData); }
3. 额外优化:使用GTK原生对话框(可选)
GTK提供了GtkDialog这类原生对话框组件,比手动创建GtkWindow更规范,也能简化生命周期管理。比如用gtk_dialog_new_with_buttons快速创建带按钮的对话框,再把entry添加到对话框的内容区域,无需手动管理结构体内存。
修改后的关键代码片段
GetAnswer函数修改:
void GetAnswer(const gchar *inputText, gchar *answer, GlobalStruct *globalData) { Array inputArray; CreateArray(&inputArray); ConvertToArray(&inputArray, inputText); g_print("\nInfixArray:\n"); PrintPolish(&inputArray); g_print("\n"); gboolean xFlag = false; if (CheckInfix(&inputArray, &xFlag)) { if (xFlag) { g_print("\nFound \"x\"\n"); // 动态分配结构体 DialogStruct *dialogData = g_malloc(sizeof(DialogStruct)); CreateDialogWindow(globalData, dialogData); } } // 记得释放inputArray的内存(如果有分配逻辑的话) }
OkButtonClicked函数修改:
void OkButtonClicked(GtkWidget *button, gpointer data) { DialogStruct *dialogData = (DialogStruct *)data; // 获取对话框顶层窗口 GtkWidget *dialogWindow = gtk_widget_get_toplevel(dialogData->dialogEntry); const gchar *label = gtk_button_get_label(GTK_BUTTON(button)); if (!g_strcmp0(label, "OK")) { const gchar *xVal = gtk_entry_get_text(GTK_ENTRY(dialogData->dialogEntry)); g_print("x的值是:%s\n", xVal); // 这里可以把x值传递回计算器逻辑,替换表达式中的x并计算结果 } // 清理资源 gtk_widget_destroy(dialogWindow); g_free(dialogData); }
内容的提问来源于stack exchange,提问作者Cheval-R
相关产品推荐
相关产品推荐

