调用free()时损坏的未分类块

Ang*_*gus 8 c

*** glibc detected *** ./a.out: free(): corrupted unsorted chunks: 0x00000000007646b0 ***
*** glibc detected *** ./a.out: malloc(): memory corruption: 0x00000000007635a0 ***
Run Code Online (Sandbox Code Playgroud)

我收到了上述错误.但是我确定我在释放后没有使用内存.为什么我会收到上述错误?

dor*_*ron 18

所有堆都存储着某些类型的元数据.当你执行malloc或free时,堆通常会在堆上执行一些簿记功能.如果它在元数据中检测到完全意外的事情,它通常会崩溃.

正常堆操作极不可能导致此类问题,因此您的程序最有可能是原因.由于您的程序可以访问进程中的所有内存,包括堆元数据,因此您的程序可能会意外覆盖某些元数据.

可能的原因是写入超出分配缓冲区的末尾.这种写入很可能是允许的,并且极有可能破坏堆元数据.当堆检测到这种情况时,您的程序通常会中止.

  • 很棒的评论!我想补充一点,有时这些类型的错误不会在发生错误的确切代码区域中显现出来,而是在其他地方,在明显不相关的代码区域中。这种情况经常发生,例如,当您使用 LAPACK 子例程进行矩阵乘法(如“dgemm”)并且您编写了错误的前导顺序时。该特定操作的结果可能是正确的,但稍后在不相关变量的代码分配中可能会失败。 (2认同)

Can*_*ame 4

可能是您尝试使用未正确指向动态分配内存的指针进行释放。