通常的做法是分配比所需更多的内存,并在末尾放置一个标记(在过度分配的内存中).释放时,您将检查标记是否未被覆盖.
对于我自己,我已经创建了一个malloc()的自定义版本,它在块的开头和结尾放置一个标记:
+--------+
| size |
|BEEFF00D|
p-> | ... |
|DEADC0DA|
+--------+
并将返回p而不是真正分配的块.
当我释放块时,我在指针之前检查它的值是否为0xBEEFF00D,如果没有,则要释放的指针无效.然后,如果它有效,我检查块的末尾(我已经存储了大小)并查看标记0xDEADC0DA是否存在,如果没有出现边界错误.
如果一切正常,在释放(实际)块之前,我用标记0xDEFACED替换初始标记0xBEEFF00D,以便捕获double free()错误.
我已经设置了所有内容,以便我可以包含一个标头并使用符号UTL_MEMCHECK进行编译,以便每个free(),malloc(),calloc(),realloc()和strdup()都将被我的检查版本替换.当我确定一切正常时,我会在没有定义UTL_MEMCHECK的情况下重新编译.这可能对你来说太过分了,但如果你感兴趣,你可以在这里找到我的代码:https://github.com/rdentato/clibutl/blob/master/src/utl.h
只需跳过第875行并忽略其余部分.