图像加载器中的Mem泄漏

时间:2010-07-08 06:09:25

标签: 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;
 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);
}

但是当我尝试调用此功能时,我有内存泄漏。为什么?功能实现有什么问题?

谢谢

3 个答案:

答案 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调用完成。 希望有所帮助。