2

次の GTK プログラム:

#include <gtk/gtk.h>
GtkVBox *vbox;
GtkWindow *win;
gboolean Timer (gpointer user_data)
{
   gtk_widget_queue_draw (GTK_WIDGET (vbox));
   return 1;
}
int main(int argc, char **argv)
{
   gtk_init(&argc, &argv);
   win = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
   vbox = (GtkVBox*)gtk_vbox_new(TRUE, 1);
   gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox));
   g_timeout_add (200, Timer, 0);
   gtk_widget_show_all(GTK_WIDGET(win));
   gtk_main();
   return 0;
}

タスク マネージャが示すように、gcc 4.5.2 を使用してコンパイルすると、Windows 7 64 ビットでリークします。Windows XP 32 ビットでコンパイルした場合はリークしません。プログラムは何もしません。ウィンドウを作成し、そこにボックスを置き、200ms ごとにタイマーから gtk_widget_queue_draw を呼び出します。

テストをコンパイルしてリンクするためのバッチ ファイルを次に示します。変数 GTK は、GTK のバイナリ配布を含むディレクトリに設定されます。たとえば、この場合は 2.24.10 です。

set GTK=c:/temp/GTK
gcc -c -mms-bitfields -I%gtk%/lib/gtk-2.0/include -I%gtk%/lib/gdk-2.0/include -I%gtk%/lib/glib-2.0/include -I%gtk%/include -I%gtk%/include/atk-1.0 -I%gtk%/include/gdk-pixbuf-2.0 -I%gtk%/include/cairo -I%gtk%/include/pango-1.0 -I%gtk%/include/gio-win32-2.0 -I%gtk%/include/glib-2.0 -I%gtk%/include/gtk-2.0 test.c
gcc test.o --mwindows -Wl,-luuid -L%gtk%/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -lgobject-2.0 -lglib-2.0 -o test.exe

何かご意見は?ここで壊れているのは GTK、gcc、MinGW? いくつかのコンパイラ/リンカー オプションがありませんか?

4

2 に答える 2

1

Windows 7 64-bit、 および を使用32-bit MinGWGTK+ます。

gtk_widget_queue_draw (GTK_WIDGET (vbox));関数で呼び出しを行わない同様のケースがありTimerます。

私の印象ではg_timeout_add()、メモリ リークを引き起こすのは (Windows タスク マネージャーの [プロセス] タブで報告されているように) PTL です。

于 2012-09-25T21:42:33.970 に答える
1

これは GTKバグ 685959 でした。リークの大部分は GTK 2.24.14 で修正されました。

バグ 707760は、パッケージ (バイナリ、バンドル) の更新を追跡します。

于 2012-10-18T08:43:24.860 に答える