当我运行这个简单的测试程序时,瓦伦会报告一个内存泄漏:
#include <gdk-pixbuf/gdk-pixbuf.h>
int main() {
GdkPixbuf* buf;
GError* err = NULL;
buf = gdk_pixbuf_new_from_file("test.jpg", &err);
g_assert_no_error(err);
g_object_unref(buf);
return 0;
}我知道有关val差事和GLib/GDK/GTK的问题,以及关于这个问题的几个StackOverflow答案(如这一个、另一个和其他)。
对于GLib来说,用G_DEBUG=gc-friendly G_SLICE=always-malloc作为valgrind命令的前缀就足够了(尽管我仍然有一些“仍可实现的”泄漏,如果它们来自GLib,则忽略它们)。
然而,通过这个小程序,我得到了大量的“可能丢失”泄漏。我也尝试过其他前缀,如G_DEBUG=resident-modules (建议的这里)和G_SLICE=debug-blocks (建议的这里),但是“可能丢失”的泄漏仍然存在。我也尝试了几个GNOME抑制,也就是GDK,但是没有结果。
我的问题是:我唯一的选择是为这种情况创建一个抑制文件,还是代码有问题?
该方案的编制内容如下:
gcc -Wall -std=c99 -g -pedantic `pkg-config --cflags glib-2.0 gdk-pixbuf-2.0` pixbuf.c -o pixbuf `pkg-config --libs glib-2.0 gdk-pixbuf-2.0`我使用的是GDK-Pixbuf2.30.7(Ubuntu14.04)。
提前谢谢。
发布于 2014-10-27 02:55:52
我看到的所有“可能丢失”块都来自于在GObject中注册类型的时间。这些都仍然是可触及的,只是勇敢的人不知道如何达到它们(诚然,这有点奇怪,我不怪勇敢被弄糊涂了),所以报告说他们“可能迷路了”,而不是“仍然可以接触到”。
您的代码没有什么问题,也没有什么漏洞。您应该使用一个抑制文件。
发布于 2014-10-24 21:17:26
如果gdk_pixbuf_new_from_file()由于某种原因而失败(例如,该文件不存在),则"buf“将被赋值为NULL,错误将通过"err”返回。然后g_assert_no_error(err)将终止程序,但它不会释放"err“指向的内存。如果您自己管理错误并使用g_free_error(err)释放"err“,您会更好。在调用"gdk_pixbuf_new_from_file“之后,删除其余的代码,将其替换为下面的代码,并查看您从Val差伦得到的结果:
if (!buf) {
g_printerr("%s\n", err->message);
g_free_error(err);
}
else {
g_object_unref(buf);
}顺便说一句,我对瓦兰不太熟悉,我只是指出可能的内存泄漏。虽然此时您的程序已经终止,并且内核可能足够聪明地回收分配给程序的内存块。
https://stackoverflow.com/questions/25342220
复制相似问题