c,doug lea的malloc - 不正确的免费不会崩溃。为什么?

时间:2013-03-07 08:38:29

标签: c crash dynamic-allocation

我在以下代码中使用了Doug Lea的malloc.cmalloc.h

#include <stdio.h>
#include <string.h>
#include "dlmalloc.h"

#define USE_DL_PREFIX

int main() 
{
    char *test = dlcalloc(5, 1);

    strcpy(test, "helloextra");    
    dlfree(test);                  /* Shouldn't this crash? */

    printf("%s", test);

    return 0;
}

test正确打印!有人可以解释一下吗?我想我没有调整过这个malloc吧。以前有人遇到过这个问题吗?

在我this problem之后,我开始使用Doug Lea的malloc。

3 个答案:

答案 0 :(得分:3)

您的代码在strcpy()中有undefined behaviour。允许崩溃,但不是必需的。

基本上,一旦行为未定义,任何事情都可能发生

答案 1 :(得分:1)

我认为你期望释放内存也会使内容无效,但事实并非如此。这样效率太低了。 (想想大量的记忆)

所有发生的事情是内存块(再次)被标记为“可由malloc使用”,因此其他内容可以在其他进程写入时随时更改,这意味着“所有投注都已关闭”,也称为作为“未定义的行为”。

如果您希望内存无效,请查看memset

答案 2 :(得分:1)

如果你想让它崩溃,请定义FOOTERS,根据你链接的malloc.h剪断:

  

当定义FOOTERS时,除了范围检查外,我们还有   验证使用块的页脚字段,可用于保证
  mstate控制malloc / free是完整的。

如果缓冲区溢出,应该 dlfree调用abort()