2015-08-18 11 views
0

我不确定这里是否有内存泄漏 - 它关于在GTK中退出一个简单的弹出窗口。正确退出一个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

这应该不会泄漏内存。该窗口假定对标签的引用,所以标签将被破坏并随窗口释放。当你点击窗口标题栏的关闭按钮(这是根据你所拥有的代码关闭该窗口的唯一方法)时,窗口将被破坏并释放。

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

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的东西来告知他们哪些输入属于每个字段。

+0

谢谢 - 我会看看这个 – java