【问题标题】:GUI with GTK with several memory leaks带有 GTK 的 GUI 有几个内存泄漏
【发布时间】:2016-11-29 19:54:15
【问题描述】:

我开始学习 GTK-3.0 并开始为我工作的程序创建 GUI。

程序编译良好,没有任何警告,但是当我使用valgrind 运行它时,我看到很多内存泄漏,我无法弄清楚我在做什么错了。

我将我的程序简化为最少的代码,以便您轻松解释问题。

以下代码编译良好,但内存泄漏很多:

#include <gtk/gtk.h>

int main(int argc, char *argv[]){
    gtk_init(&argc, &argv);
    GtkWidget *window;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show(window);
    gtk_main();
}

我编译它:

gcc -Wpedantic -std=c11 -Wall -Wextra -Werror  -Wstrict-prototypes  -Wmissing-prototypes -Wold-style-definition -Wconversion -Wshadow -Winit-self -Wfloat-equal -Wwrite-strings -O0 -g main.c -o app `pkg-config --cflags gtk+-3.0 ` `pkg-config --libs gtk+-3.0 `

在我使用以下命令运行valgrind 之后:

valgrind --leak-check=full --track-origins=yes --leak-check=full ./app

我得到以下输出:

==14405== Memcheck, a memory error detector
==14405== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==14405== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==14405== Command: ./app
==14405== 
==14405== 
==14405== HEAP SUMMARY:
==14405==     in use at exit: 1,243,902 bytes in 12,774 blocks
==14405==   total heap usage: 80,535 allocs, 67,761 frees, 6,190,649 bytes allocated
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,279 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796522: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A30B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,280 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x4C2FDEF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796406: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A30B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,281 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796522: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A371: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,282 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x4C2FDEF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796406: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A371: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,283 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796522: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5783B04: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774181: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,284 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x4C2FDEF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796406: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5783B04: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774181: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,285 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796522: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577EC1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774186: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 16 bytes in 1 blocks are possibly lost in loss record 1,286 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x4C2FDEF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796406: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF90: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577EC1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774186: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 24 bytes in 1 blocks are possibly lost in loss record 1,808 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x57993B5: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5798E2C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5788147: g_param_spec_flags (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5191F6F: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x579922C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x4EBFC49: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x7532A1D: atk_add_focus_tracker (in /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0.21809.1)
==14405==    by 0x4EC0084: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x5778FA4: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x578AFC0: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405== 
==14405== 32 bytes in 1 blocks are possibly lost in loss record 2,824 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x57993B5: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5798E2C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5788057: g_param_spec_enum (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5FCBAFE: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.1800.9)
==14405==    by 0x579922C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5798E2C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57803A3: g_object_new_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5780520: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5FF16DD: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.1800.9)
==14405==    by 0x5FF3E21: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.1800.9)
==14405== 
==14405== 56 bytes in 1 blocks are possibly lost in loss record 3,553 of 5,945
==14405==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x57959D8: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579B2CC: g_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A53D: g_flags_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x50A2D0A: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FB9264: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x579922C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57803A3: g_object_new_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5780520: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x4FBAAB7: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FBAE82: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405== 
==14405== 80 bytes in 1 blocks are possibly lost in loss record 4,221 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x57993B5: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5798E2C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579C247: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57840D2: g_param_spec_internal (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5788661: g_param_spec_object (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5FD1231: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.1800.9)
==14405==    by 0x579922C: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577FDAC: g_object_newv (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5780533: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5FD1324: gdk_display_manager_get (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.1800.9)
==14405== 
==14405== 96 bytes in 1 blocks are possibly lost in loss record 5,132 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5795A59: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5795B43: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57740AA: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 96 bytes in 1 blocks are possibly lost in loss record 5,133 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5795A59: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5795B43: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF82: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A30B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 96 bytes in 1 blocks are possibly lost in loss record 5,134 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5795A59: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5795B43: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF82: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A371: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 96 bytes in 1 blocks are possibly lost in loss record 5,135 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5795A59: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5795B43: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF82: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5783B04: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774181: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 96 bytes in 1 blocks are possibly lost in loss record 5,136 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5795A59: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5795B43: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AF82: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577EC1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774186: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 132 bytes in 1 blocks are possibly lost in loss record 5,413 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796DFF: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AFE0: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A30B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 132 bytes in 1 blocks are possibly lost in loss record 5,414 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796DFF: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AFE0: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577A371: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774177: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 148 bytes in 1 blocks are possibly lost in loss record 5,457 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796BD6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AFE0: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5783B04: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774181: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 148 bytes in 1 blocks are possibly lost in loss record 5,458 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x5796BD6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579AFE0: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577EC1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5774186: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 176 bytes in 4 blocks are possibly lost in loss record 5,513 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2728: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x4FA7173: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FA7439: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FA622C: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4F02766: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4F03FE4: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4F0425D: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x577E896: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57801B4: g_object_new_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5780520: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x4F02D27: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405== 
==14405== 184 bytes in 1 blocks are possibly lost in loss record 5,528 of 5,945
==14405==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E27E7: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x57959D8: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x579B2CC: g_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5785799: g_param_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5787AFB: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x577418B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x40104E9: call_init.part.0 (dl-init.c:72)
==14405==    by 0x40105FA: call_init (dl-init.c:30)
==14405==    by 0x40105FA: _dl_init (dl-init.c:120)
==14405==    by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==14405== 
==14405== 200 bytes in 5 blocks are possibly lost in loss record 5,549 of 5,945
==14405==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x86E2728: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x86FB537: g_memdup (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x4FA7109: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FA7387: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4FA61EC: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x50EFD11: gtk_style_context_set_state (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4F03EE4: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x4F0425D: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1800.9)
==14405==    by 0x577E896: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x57801B4: g_object_new_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405==    by 0x5780520: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4800.1)
==14405== 
==14405== 336 bytes in 1 blocks are possibly lost in loss record 5,673 of 5,945
==14405==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14405==    by 0x40136D4: allocate_dtv (dl-tls.c:322)
==14405==    by 0x40136D4: _dl_allocate_tls (dl-tls.c:539)
==14405==    by 0x59C42AE: allocate_stack (allocatestack.c:588)
==14405==    by 0x59C42AE: pthread_create@@GLIBC_2.2.5 (pthread_create.c:539)
==14405==    by 0x87218AF: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x8703E9E: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x8703F57: g_thread_new (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x86DE280: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1)
==14405==    by 0x8392E16: g_task_get_type (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.4800.1)
==14405==    by 0x83F0610: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.4800.1)
==14405==    by 0x83E4216: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.4800.1)
==14405== 
==14405== 
==14405== LEAK SUMMARY:
==14405==    definitely lost: 0 bytes in 0 blocks
==14405==    indirectly lost: 0 bytes in 0 blocks
==14405==      possibly lost: 3,544 bytes in 35 blocks
==14405==    still reachable: 1,160,006 bytes in 12,091 blocks
==14405==                       of which reachable via heuristic:
==14405==                         length64           : 4,080 bytes in 72 blocks
==14405==                         newarray           : 2,112 bytes in 52 blocks
==14405==         suppressed: 0 bytes in 0 blocks
==14405== Reachable blocks (those to which a pointer was found) are not shown.
==14405== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==14405== 
==14405== For counts of detected and suppressed errors, rerun with: -v
==14405== ERROR SUMMARY: 28 errors from 28 contexts (suppressed: 0 from 0)

在我读完一本书并关注GTK3 Manual 之后,我就能弄清楚这里的漏洞在哪里。

我在这里开始使用 GUI 有问题吗?从手册中我几乎可以确定我以正确的方式编写代码。

我在valgrind 输出中看到callocrealloc 被调用,这意味着它也应该是free() 调用。 如果必须这样做,如何使用 GTK+ 释放该内存?

【问题讨论】:

    标签: valgrind gtk3


    【解决方案1】:

    这里已经回答了很多次了。这是我在一个我曾经主持过的论坛上对其他人提出的问题的回答:

    GTK+ 在分配和释放应用程序生命周期所需的内部缓冲区时非常懒惰。例如,它可以在初始化期间为查找表分配一个内存区域,这是应用程序生命周期所需的。 GTK+ 将永远不会释放它。对 Valgrind 来说,这看起来像是内存泄漏(从技术上讲确实如此),但作为一种优化,GTK+ 不会释放它,因为它将在应用程序退出期间被释放,因此不是错误。这就是为什么你需要抑制文件以便 Valgrind 可以忽略这些文件。问题是您需要在大多数 GTK+ 版本更改中更改这些内容。

    您看到的是误报。您可以使用抑制文件,以便 valgrind 可以忽略这些。您可以创建自己的或搜索已完成的。

    【讨论】:

    • 你在说什么我也在网上找到了,但没有任何例子。请为您的答案提供一个示例。如果一切正常,我打算创建的程序将至少运行 45 天。所以我需要解决这个问题。
    • @Michi Errol... 的意思是,valgrind 显示“问题”,实际上没有(=“误报”)。看起来有问题,但没有。所以你可以忽略它。
    • @DarkTrick 自 2016 年以来发生了许多变化,但始终有一个变化:当 GTK 需要 glib 时,调试 glib 是最糟糕的事情。经过几 1000 行后,您在调试时并不那么高兴。
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多