一段时间以来,我一直很高兴将 dlmalloc 用于跨平台项目(Windows、Mac OS X、Ubuntu)。然而,最近似乎在 Windows 7 上使用 dlmalloc 会导致退出时崩溃。
为了确保它在我的项目中不是愚蠢的东西,我创建了一个 super 最小的测试程序——它除了从 main 返回之外什么都不做。一个版本(“malloctest
”)链接到 dlmalloc 而另一个版本(“regulartest
”)没有。在 WinXP 上,两者都运行良好。在 Windows 7 上,malloctest
崩溃。您可以查看 here 测试的截屏视频。
我的问题是:为什么会这样?这是 dlmalloc 中的错误吗?还是 Windows 7 中的加载程序发生了变化?有解决方法吗?
仅供引用,这是测试代码(test.cpp):
#include <stdio.h>
int main() {
return 0;
}
这是 nmake 生成文件:
all: regulartest.exe malloctest.exe
malloctest.exe: malloc.obj test.obj
link /out:$@ $**
regulartest.exe: test.obj
link /out:$@ $**
clean:
del *.exe *.obj
为简洁起见,我不会在这篇文章中包含 dlmalloc 源代码,但您可以获取它 (v2.8.4) here 。
编辑: 查看其他相关的 SO 帖子:
最佳答案
看起来像 C 运行时中的错误。在 Windows 7 上使用 Visual Studio 2008,我重现了同样的问题。通过在 dlmalloc
和 dlfree
中放置断点进行一些快速调试后,我看到 dlfree
被调用时使用了一个它之前从未从 dlmalloc
返回的地址,然后它在此后不久就遇到了访问冲突。
幸运的是,C 运行时的源代码与 VS 一起分发,所以我可以看到对 free
的这个调用来自 __endstdio
中的 _file.c
函数。相应的分配在 __initstdio
中,它正在调用 _calloc_crt
来分配其内存。 _calloc_crt
调用 _calloc_impl
,后者调用 HeapAlloc
来获取内存。 _malloc_crt
(在 C 运行时的其他地方使用,例如为环境和 argv
分配内存),另一方面,直接调用 malloc
,而 _free_crt
直接调用 free
。
因此,对于使用 _malloc_crt
分配并使用 _free_crt
释放的内存,一切都很好。但是对于使用 _calloc_crt
分配并使用 _free_crt
释放的内存,会发生不好的事情。
我不知道是否支持像这样替换 malloc
—— 如果支持,那么这是 CRT 的错误。如果没有,我建议查看不同的 C 运行时(例如 MinGW 或 Cygwin GCC)。
关于c - dlmalloc 在 Win7 上崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4090971/