【问题标题】:Mem leak in image loader图像加载器中的内存泄漏
【发布时间】:2010-07-08 06:09:25
【问题描述】:

我有一个从流中加载 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);
}

但是当我尝试调用这个函数时,我有内存泄漏。为什么?函数实现有什么问题?

谢谢

【问题讨论】:

    标签: c memory-leaks gtk


    【解决方案1】:

    if 块中的语句顺序是否正确?

     if (n_read == 0)
       {
          break;
          g_object_unref(loader);
       }
    

    【讨论】:

      【解决方案2】:

      条件之后 如果(n_read == 0) 你先提供了一个休息时间。因此加载的 pixbuff 不会被释放。所以你遇到了内存泄漏。

      补充点:

      你将一个双指针,即error 传递给函数

      g_input_stream_read 
      

      如果 API 中出现错误,该指针将加载错误代码和错误字符串。请在将其分配给 NULL 之前检查它。您可能可以在此处查看 GError 的结构定义。 GError 请检查代码和消息的值以获取有关错误的描述。

      所有其他 API 调用也必须这样做。 希望对您有所帮助。

      【讨论】:

        【解决方案3】:
        • 您的缩进(或缺少缩进)使代码无法阅读。修复它,错误可能会更明显。
        • if (n_read == 0) 中有无法访问的代码,就在 break 语句之后。
        • 您在释放加载程序时似乎不一致。
        • error 从未初始化,而是传递给 gdk_pixbuf_loader_new

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-27
          • 2016-08-10
          • 2017-05-10
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          相关资源
          最近更新 更多