免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: huasd1109
打印 上一主题 下一主题

[C] C语言实现split函数 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-07-14 10:09 |只看该作者
原帖由 飞灰橙 于 2008-7-12 02:43 发表


不要生气,我帮你找的每一个bug,都是有充分的理由的。

1. g_ptr_array_free, 第二个参数设成TRUE, free的东西不是你想要的。
    请翻出g_ptr_array_free 和 g_free 的代码一看便知。

2. ...


  1. #include <garray.c>
  2. gpointer*
  3. g_ptr_array_free (GPtrArray   *array,
  4.                   gboolean  free_segment)
  5. {
  6.   gpointer* segment;

  7.   g_return_val_if_fail (array, NULL);

  8.   if (free_segment)
  9.     {
  10.       g_free (array->pdata);
  11.       segment = NULL;
  12.     }
  13.   else
  14.     segment = array->pdata;

  15.   G_LOCK (ptr_array_mem_chunk);
  16.   g_mem_chunk_free (ptr_array_mem_chunk, array);
  17.   G_UNLOCK (ptr_array_mem_chunk);

  18.   return segment;
  19. }

  20. #include <gmem.c>
  21. void
  22. g_free (gpointer mem)
  23. {
  24.   if (mem)
  25.     glib_mem_vtable.free (mem);
  26. }

  27. /* --- variables --- */
  28. static GMemVTable glib_mem_vtable = {
  29.   standard_malloc,
  30.   standard_realloc,
  31.   standard_free,
  32.   standard_calloc,
  33.   standard_try_malloc,
  34.   standard_try_realloc,
  35. };

  36. #  define standard_free                free
复制代码


g_free也就是调用了标准库的free,该函数位于stdlib.h中,但是我找半天没找到stdlib.c,不知道是不是这样找呢?

小弟初学linux,问的问题让大家见笑了!

论坛徽章:
0
42 [报告]
发表于 2008-07-14 10:31 |只看该作者
原帖由 veking 于 2008-7-14 10:09 发表



#include
gpointer*
g_ptr_array_free (GPtrArray   *array,
                  gboolean  free_segment)
{
  gpointer* segment;

  g_return_val_if_fail (array, NULL);

  if (free_segment)
    {
    ...


array->pdata怎么也不会是strdup返回的这个指针。
可以想一下,假设array中有10个元素,应该传了10个strdup返回指针进入,
应该free 10次。
这段代码怎么会free 10次呢

论坛徽章:
0
43 [报告]
发表于 2008-07-14 13:46 |只看该作者
原帖由 飞灰橙 于 2008-7-14 10:31 发表


array->pdata怎么也不会是strdup返回的这个指针。
可以想一下,假设array中有10个元素,应该传了10个strdup返回指针进入,
应该free 10次。
这段代码怎么会free 10次呢



那如果设置为  g_ptr_array_free(arr, FALSE) ,那么strdup复制的值能被释放吗?从代码中看好像没有释放吧!

-------------------------------------------------------------------------------------------------------
gpointer*
g_ptr_array_free (GPtrArray   *array,
                  gboolean  free_segment)
{
  gpointer* segment;

  g_return_val_if_fail (array, NULL);

  if (free_segment)
    {
      g_free (array->pdata);
      segment = NULL;
    }
  else
    segment = array->pdata;

  G_LOCK (ptr_array_mem_chunk);
  g_mem_chunk_free (ptr_array_mem_chunk, array);
  G_UNLOCK (ptr_array_mem_chunk);


  return segment;
}
设置为FALSE应该是红字部分会释放吧!?

[ 本帖最后由 veking 于 2008-7-14 13:48 编辑 ]

论坛徽章:
0
44 [报告]
发表于 2008-07-14 13:56 |只看该作者
在什么情况下才用 g_ptr_array_free(arr, FALSE); 呢?

GPtrArray *arr = g_ptr_array_new();
g_ptr_array_add(arr, g_strdup("1"));
g_ptr_array_add(arr, g_strdup("2"));
g_ptr_array_add(arr, g_strdup("3"));
g_ptr_array_free(arr, FALSE);   /// ???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP