我正在编写一个简单的基于链表的内存管理器,格式如下:
...Header|Block|Header|Block... 带有已使用和空闲列表。
如果要求 realloc() 函数减小块的大小,是否可以用新创建的块的标头覆盖一些尾随字节?我读过的文档表明这是“未定义的行为”,但应用程序是否依赖于仍然存在的数据?
最有可能的是,关于未定义行为的评论是这样的:“当 realloc 返回时,访问块结束后的任何字节都是未定义的”。
这样的规范正是为了允许您在 realloc 的实现中将标头放入尾随字节中。它是未定义的行为意味着如果应用程序尝试从字节中读取(概念上已经消失),它将读取您的标头,这对应用程序来说将显示为垃圾;如果它甚至写入,它会杀死你的标题 - 所以应用程序不应该这样做。
当然。它已被重新分配,所以现在它已被应用程序释放,它属于您的经理。用新的指针开始破坏它是正常的。