C 映像加载程序中的内存泄漏
我有一个从流中加载GdkPixbufAnimation的函数C 映像加载程序中的内存泄漏,c,memory-leaks,gtk,C,Memory Leaks,Gtk,我有一个从流中加载GdkPixbufAnimation的函数 GdkPixbufAnimation* load_image_from_stream(GInputStream* input_stream, GCancellable* generator_cancellable) { GError** error; gboolean res; gssize n_read; guchar buffer[65535]; GdkPixbufAnimation* animation;
GdkPixbufAnimation* load_image_from_stream(GInputStream* input_stream, GCancellable* generator_cancellable)
{
GError** error;
gboolean res;
gssize n_read;
guchar buffer[65535];
GdkPixbufAnimation* animation;
GdkPixbufLoader* loader;
loader = gdk_pixbuf_loader_new();
res = TRUE;
while (1)
{
n_read = g_input_stream_read (input_stream, buffer, sizeof (buffer), generator_cancellable, error);
if (n_read < 0)
{
res = FALSE;
error = NULL;
g_object_unref(loader);
break;
}
if (n_read == 0)
{
break;
g_object_unref(loader);
}
if (!gdk_pixbuf_loader_write (loader, buffer, n_read, error))
{
res = FALSE;
error = NULL;
g_object_unref(loader);
break;
}
}
if (!gdk_pixbuf_loader_close (loader, error))
{
res = FALSE;
error = NULL;
return;
}
animation = NULL;
if (res)
{
animation = gdk_pixbuf_loader_get_animation(loader);
if (animation)
{
g_object_ref (animation);
g_object_unref(loader);
}
}
return animation;
}
但是当我尝试调用这个函数时,我有mem泄漏。为什么?函数实现中有什么问题
谢谢如果块中的语句顺序正确,则
中的语句是否正确
if (n_read == 0)
{
break;
g_object_unref(loader);
}
if
块中的语句顺序正确吗
if (n_read == 0)
{
break;
g_object_unref(loader);
}
- 缩进(或缺少缩进)使代码无法读取。修正这个问题,错误可能会更加明显
- 如果(n_read==0)
,就在break语句之后,中有无法访问的代码
您在释放加载程序时似乎不一致
中的错误
从未初始化,但被传递到gdk\u pixbuf\u loader\u new
- 缩进(或缺少缩进)使代码无法读取。修正这个问题,错误可能会更加明显
- 如果(n_read==0)
,就在break语句之后,中有无法访问的代码
您在释放加载程序时似乎不一致
中的错误
从未初始化,但被传递到gdk\u pixbuf\u loader\u new
在该条件之后
如果(n_read==0)
你先休息一下。因此,加载的pixbuff不会被释放。所以你的内存泄漏了
其他要点:
向函数传递一个双指针,即error
g_input_stream_read
如果API中存在错误,则此指针将加载错误代码和错误字符串。请在将其分配给NULL之前进行检查。您可能可以在这里检查GError的结构定义。
请检查代码和消息的值,以获取有关错误的说明
所有其他API调用也必须这样做。
希望对你有所帮助。之后的情况
如果(n_read==0)
你先休息一下。因此,加载的pixbuff不会被释放。所以你的内存泄漏了
其他要点:
向函数传递一个双指针,即error
g_input_stream_read
如果API中存在错误,则此指针将加载错误代码和错误字符串。请在将其分配给NULL之前进行检查。您可能可以在这里检查GError的结构定义。
请检查代码和消息的值,以获取有关错误的说明
所有其他API调用也必须这样做。
希望有帮助