1

我在以下代码中使用 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。以前有人遇到过这个问题吗?

遇到这个问题后,我开始使用 Doug Lea 的 malloc 。

4

3 回答 3

3

您的代码. strcpy()允许崩溃,但不是必须的。

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

于 2013-03-07T08:39:51.150 回答
1

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

所发生的一切是内存块(再次)被标记为“可供 malloc 使用”,因此它们的内容可能会在其他进程写入时随时更改,这意味着“所有赌注都关闭”,也称为“未定义”行为”。

如果您希望内存为空,请查看memset

于 2013-03-07T08:40:43.657 回答
1

如果您希望它崩溃,请根据您链接到的malloc.h中的此片段定义 FOOTERS:

定义FOOTERS时,除了范围检查外,我们还
验证了inuse chunk的footer字段,可以用来保证
控制malloc/free的mstate是完整的。

快速浏览一下,如果缓冲区溢出,那应该调用。dlfreeabort()

于 2013-03-07T09:00:00.317 回答