You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:35:53