Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 映像加载程序中的内存泄漏_C_Memory Leaks_Gtk - Fatal编程技术网

C 映像加载程序中的内存泄漏

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的函数

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调用也必须这样做。 希望有帮助