* glibc detected ./load: double free or corruption (!prev): ADDRESS **当使用glibc时,它怎么知道我是双重释放的?它能追踪到我放出来的所有东西吗?它是否包含在元数据中,比如免费如何知道要释放多少空间(How does free know how much to free?)
发布于 2013-09-03 11:20:21
对于每个分配,内存管理器保留一些“头”(最有可能是树节点或链接列表)。当您传递给释放不包含有效头的东西时--嗯,它不能正确地被释放。至于这些信息保存在哪里--它取决于实现,但通常放在malloc的地址之前--然而,大小和结构很可能是未知的,但至少它给出了一个信息头有多容易被破坏/损坏/覆盖/等等。
发布于 2013-09-03 11:25:19
当你破坏某个东西时,你会得到一个内存块上的指针。你已经知道^^了。内存管理还在*您的单元(例如,跟踪单元大小)之前保留一个(隐藏)头,当您释放指针时,标题为红色,以检查它是否为有效指针。空闲操作也擦除标头。如果您释放两次,标题将不再有效的第二个空闲。所以才被发现。
发布于 2013-09-03 11:25:48
C语言标准说,第二次释放指针是一种未定义的行为。您在glibc中看到的是这种未定义的行为的一个特殊情况--一个有用的行为--发出消息。大多数分配程序都会跟踪所分配的内容,并在一定数量范围内跟踪已释放的内容。但你不能指望这种行为。
还允许C程序静默地崩溃或忽略情况(或它认为必要的任何其他操作)。
https://stackoverflow.com/questions/18590786
复制相似问题