当我在大学里实现我自己的malloc()版本时,我使用了两个链接列表:一个空闲列表和一个已分配缓冲区列表(当我用完时穿插了对sbrk的调用)。但现在我遇到了现实世界的问题:我们的软件malloc缓冲区并将它们放在链接列表中,以后可以通过一个函数或另一个函数释放它们。但很少有代码与malloc()
具有相同功能的free()这偶尔会导致malloc'ed缓冲区被释放两次。在Solaris下,这显然不是问题,因为应用程序已经运行了很长时间。但是在Linux(RH)下运行代码时,这个bug突然被唤醒了。
我不知道malloc()的内部行为,但它显然依赖于实现。我不知道Linux / gcc实现是否维护了已分配缓冲区的列表。 (免费清单是必须的;分配的清单?我认为不是那么多。)这引出了我的问题:
在阅读a response my hmjd to a question by ant2009我的方案之后,如果上面的答案是肯定的,就是用扩展代码的宏替换对free()的调用:
这样的功能肯定不在我的手册中,但我会欢迎。 (当我写这篇文章时,我即将下载glibc-2.17.tar.xz;也可以在那里找到答案。)
感谢。 (即使只是阅读这篇文章!)
- 雅各布
答案 0 :(得分:1)
这是一个大问题,而不是你的崩溃......
你不能根据地址判断第二个免费是用于你的对象还是另一个同时被malloced并正在使用的对象......
关于你的观点:
free()
在所有现代实施中都是无效的,不重要。 你有一个错误,你需要克服修复C语言的冲动,并修复你的代码......
NULL
'指针是好的,但它只是一步,因为一旦你把指针的副本关闭了...将你的本地副本归零不会使另一个副本为空...
如果这是一个需要确保你可以使用另一层无差异的地方。
void ** handle;
void ** handle2;
void * obj = malloc(5);
handle = &obj;
handle2 = &obj;
free(*handle);
*handle = NULL;
free(*handle2);
*handle2 = NULL;
然后归零obj
可能会有所帮助......