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