我在以下代码中使用了Doug Lea的malloc.c和malloc.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。
答案 0 :(得分:3)
您的代码在strcpy()
中有undefined behaviour。允许崩溃,但不是必需的。
基本上,一旦行为未定义,任何事情都可能发生。
答案 1 :(得分:1)
我认为你期望释放内存也会使内容无效,但事实并非如此。这样效率太低了。 (想想大量的记忆)
所有发生的事情是内存块(再次)被标记为“可由malloc使用”,因此其他内容可以在其他进程写入时随时更改,这意味着“所有投注都已关闭”,也称为作为“未定义的行为”。
如果您希望内存无效,请查看memset
答案 2 :(得分:1)
如果你想让它崩溃,请定义FOOTERS,根据你链接的malloc.h剪断:
当定义FOOTERS时,除了范围检查外,我们还有 验证使用块的页脚字段,可用于保证
mstate控制malloc / free是完整的。
如果缓冲区溢出,应该 让dlfree
调用abort()
。