malloc的缓冲区是否仍在分配的列表中?

时间:2013-05-10 19:25:52

标签: list malloc

当我在大学里实现我自己的malloc()版本时,我使用了两个链接列表:一个空闲列表和一个已分配缓冲区列表(当我用完时穿插了对sbrk的调用)。但现在我遇到了现实世界的问题:我们的软件malloc缓冲区并将它们放在链接列表中,以后可以通过一个函数或另一个函数释放它们。但很少有代码与malloc()

具有相同功能的free()

这偶尔会导致malloc'ed缓冲区被释放两次。在Solaris下,这显然不是问题,因为应用程序已经运行了很长时间。但是在Linux(RH)下运行代码时,这个bug突然被唤醒了。

我不知道malloc()的内部行为,但它显然依赖于实现。我不知道Linux / gcc实现是否维护了已分配缓冲区的列表。 (免费清单是必须的;分配的清单?我认为不是那么多。)这引出了我的问题:

  1. malloc的这个实现是否使用已分配内存区域的列表?
  2. 是否有一个函数(我是非正式的)可以扫描给定指针的列表?
  3. 在阅读a response my hmjd to a question by ant2009我的方案之后,如果上面的答案是肯定的,就是用扩展代码的宏替换对free()的调用:

    • 检查指针是否为空,在这种情况下,它会跳过接下来的几个步骤
    • 调用这个神秘的函数以确保它仍然是malloc'd
    • Frees是使用free()
    • 的书
    • 将指针取消为已经释放的信号;不要再费心了。

    这样的功能肯定不在我的手册中,但我会欢迎。 (当我写这篇文章时,我即将下载glibc-2.17.tar.xz;也可以在那里找到答案。)

    感谢。 (即使只是阅读这篇文章!)

    - 雅各布

1 个答案:

答案 0 :(得分:1)

这是一个大问题,而不是你的崩溃......

你不能根据地址判断第二个免费是用于你的对象还是另一个同时被malloced并正在使用的对象......

关于你的观点:

  • 检查指针是否为空,在这种情况下它会跳过下几个
    • free()在所有现代实施中都是无效的,不重要。
  • 步骤调用此神秘函数以确保它仍然是malloc'd
    • 你仍然不知道它是否是你想要的对象。
  • Frees在书中使用free()将指针视为信号
    • 我不知道这意味着什么
  • 已经被释放;不要再费心了。
    • 这就是问题的症结所在,一旦你来到这里,你就处于糟糕状态。

你有一个错误,你需要克服修复C语言的冲动,并修复你的代码......

NULL'指针是好的,但它只是一步,因为一旦你把指针的副本关闭了...将你的本地副本归零不会使另一个副本为空...

如果这是一个需要确保你可以使用另一层无差异的地方。

void ** handle;
void ** handle2;

void * obj = malloc(5);

handle = &obj;
handle2 = &obj;

free(*handle);
*handle = NULL;

free(*handle2);
*handle2 = NULL;

然后归零obj可能会有所帮助......