我正在使用Doug Lea的dlmalloc内存分配器。但是,当我使用它时,我会得到细分。如果我使用普通的malloc,我的程序运行良好。我记得我曾经读到你需要先调用一些初始化函数才能让 dlmalloc 工作,但我现在不记得是哪个函数了。我试图查看评论以找出哪个功能,但仍然找不到它。
从分配器源代码中的注释中:
胎面安全:除非USE_LOCKS定义为非零,否则不是线程安全的
定义USE_LOCKS时,每个对 malloc、free 等的公共调用都用锁包围。默认情况下,这使用普通 pthread 互斥锁、win32 关键部分或旋转锁(如果可用于平台且未通过设置 USE_SPIN_LOCKS=0 禁用)。
您需要使用 USE_LOCKS
编译库,否则您可能会看到崩溃。
另一种可能性是您的程序表现出未定义的行为,不会导致常规malloc
的后果。例如,它可能会在某处的分配区域上写入一个字节,但该字节可能是比您请求的内存块大几个字节的内存块的一部分。使用 valgrind 检查程序是否存在带有"常规"malloc 的内存错误,然后再将其与自定义分配器链接。