我有一个从流加载GdkPixbufAnimation的功能。
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;
}
尝试调用此函数:
void loading(JobParam* param)
{
GInputStream* input_stream;
input_stream = g_file_read(param->file, param->generator_cancellable, NULL);
param->animation = load_image_from_stream(G_INPUT_STREAM(input_stream), param->generator_cancellable);
g_input_stream_close(input_stream, param->generator_cancellable, NULL);
g_object_unref (input_stream);
}
但是当我尝试调用此功能时,我有内存泄漏。为什么?功能实现有什么问题?
谢谢
答案 0 :(得分:3)
if
中的陈述是否按正确顺序排列?
if (n_read == 0)
{
break;
g_object_unref(loader);
}
答案 1 :(得分:3)
if (n_read == 0)
之后无法访问代码,紧接在该中断语句之后。error
从未初始化,但会传递给gdk_pixbuf_loader_new
。答案 2 :(得分:3)
条件之后 if(n_read == 0) 你先提供了休息时间。因此加载的pixbuff没有被释放。所以你得到了内存泄漏。
补充要点:
您将一个双指针error
传递给函数
g_input_stream_read
如果API中存在错误,则此指针将包含错误代码和错误字符串。请在将其指定为NULL之前进行检查。您可以在这里检查GError的结构定义。 GError 请检查代码和消息的值以获取有关错误的描述。
这也必须为所有其他API调用完成。 希望有所帮助。