正确退出GTK弹出窗口

时间:2015-08-18 09:55:00

标签: memory-leaks gtk3

我不确定这里是否存在内存泄漏 - 它是关于在GTK中退出一个简单的弹出窗口。

if (alertWindow == NULL) {
    alertWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    alertLabel = gtk_label_new (" wrong input! connection should be either s,S,p or P.\n All other data as floating numbers" );
    gtk_container_add(GTK_CONTAINER(alertWindow), alertLabel);
    g_signal_connect (alertWindow, "destroy", G_CALLBACK (destroyAlert), NULL); //avslutar applikation
}

和回调

static void destroyAlert(GtkWidget *widget, gpointer data) {
   alertWindow = NULL;
}

我将alertWindow设置为NULL,以便下次用户输入错误输入时再次创建它。

1 个答案:

答案 0 :(得分:1)

那不应该泄漏内存。该窗口假定对标签的引用,因此标签将被销毁并通过窗口释放。当您单击窗口标题栏的关闭按钮(这是根据您拥有的代码关闭该窗口的唯一方法)时,窗口将被销毁并释放。

但是,我建议采用不同的方式:

GtkWidget *alertWindow = gtk_message_dialog_new(parentWindow,
    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_USE_HEADER_BAR,
    GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE,
    "Wrong input! Connection should be either s, S, p or P.\n"
    "All other data as floating point numbers.");
gtk_dialog_run(GTK_DIALOG(alertWindow));
gtk_widget_destroy(alertWindow);

这有一些优点;首先,您将获得一个功能更全面的对话框,其中包含一个用于关闭它的友好按钮。其次,您不必使用全局变量,然后必须担心它是否为NULL。第三,对话框是模态的(对话框打开时应用程序的其余部分被禁用),这适用于这样的错误消息。

更好的方法是在用户输入时检测错误的输入,并使用类似GtkPopover的信息来告知他们每个字段中属于哪种输入。