首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdk_pixbuf_new_from_file()中的内存泄漏

gdk_pixbuf_new_from_file()中的内存泄漏
EN

Stack Overflow用户
提问于 2014-08-16 17:36:40
回答 2查看 1.9K关注 0票数 2

当我运行这个简单的测试程序时,瓦伦会报告一个内存泄漏

代码语言:javascript
复制
#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,但是没有结果。

我的问题是:我唯一的选择是为这种情况创建一个抑制文件,还是代码有问题?

该方案的编制内容如下:

代码语言:javascript
复制
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)。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-27 02:55:52

我看到的所有“可能丢失”块都来自于在GObject中注册类型的时间。这些都仍然是可触及的,只是勇敢的人不知道如何达到它们(诚然,这有点奇怪,我不怪勇敢被弄糊涂了),所以报告说他们“可能迷路了”,而不是“仍然可以接触到”。

您的代码没有什么问题,也没有什么漏洞。您应该使用一个抑制文件。

票数 1
EN

Stack Overflow用户

发布于 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差伦得到的结果:

代码语言:javascript
复制
if (!buf) {
    g_printerr("%s\n", err->message);
    g_free_error(err);
}
else {
    g_object_unref(buf);
}

顺便说一句,我对瓦兰不太熟悉,我只是指出可能的内存泄漏。虽然此时您的程序已经终止,并且内核可能足够聪明地回收分配给程序的内存块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25342220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档