* glibc detected ./load: double free or corruption (!prev): ADDRESS **
使用glibc时,它是如何知道我是双重释放的?它是否跟踪我拍摄和释放的所有内容?它是否包含在元数据中,比如免费知道要释放多少空间(How does free know how much to free?)
答案 0 :(得分:6)
对于每个分配,内存管理器会保留一些“标头”(很可能是树节点或链表)。当你传递给一些不包含有效标题的东西时 - 好吧,它无法正确释放。至于保存这些信息的地方 - 它取决于实现,但通常它放在你从malloc获得的地址之前 - 但是,大小和结构很可能是未知的,但至少它让人知道这个标题有多容易被打破/损坏/覆盖等等。
答案 1 :(得分:1)
当你使用malloc时,你会得到一个指向内存块的指针。你已经知道了^^。内存管理还会在*你的bloc(例如跟踪bloc大小)之前预留(隐藏)标题 释放指针时,标题为红色,以检查它是否为有效指针。自由操作也会删除标题。 如果你有两次免费,那么第二个免费标题将不再有效。因此检测。
答案 2 :(得分:0)
C语言标准说第二次释放指针是未定义的行为。你在glibc中看到的是这种未定义行为的一个特例 - 一个有用的行为 - 发出消息。大多数分配器会跟踪分配的内容,并且可以跟踪已释放的内容。但你不能指望这种行为。
C程序也可以默默地崩溃或忽略这种情况(或它认为必要的任何其他行动)。
答案 3 :(得分:0)
由malloc()
,calloc()
或realloc()
分配的内存确实具有分配的元数据,free()
用于取消分配已分配的内存。< / p>
但是,不应该对如何或是否检测到双重自由做出任何假设,因为标准中的行为未定义,如下所述。
free()
释放ptr
指向的内存空间,该内存空间必须由之前调用malloc()
,calloc()
或realloc()
返回。否则,或者如果之前已调用free(ptr)
,则会发生未定义的行为。如果ptr为NULL
,则不执行任何操作。