一段时间以来,我一直很高兴将 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 帖子:
  • Is there a way to redefine malloc at link time on Windows?
  • Globally override malloc in visual c++
  • 最佳答案

    看起来像 C 运行时中的错误。在 Windows 7 上使用 Visual Studio 2008,我重现了同样的问题。通过在 dlmallocdlfree 中放置断点进行一些快速调试后,我看到 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/

    10-11 16:23