使用malloc时,如果它产生带有错误的核心转储:
malloc(): memory corruption: ....... ***
Run Code Online (Sandbox Code Playgroud)
这是否意味着malloc试图分配无法自由分配的内存?如果是这样的原因是什么?
Lou*_*arg 17
它完全取决于你的malloc实现,但通常这意味着在malloc之前的某个时刻某些东西会向malloced缓冲区写入比其大小更多的数据.
许多malloc实现将一些数据与内存一起存储,换句话说:
+--------------------------------+
|14 bytes -> Padding |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data |
+--------------------------------+
|8 bytes -> Padding |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)
因此,如果您的某些代码或库向该6字节缓冲区写入16个字节,则会覆盖填充和内部malloc信息的2个字节.下次你调用malloc时,它会尝试遍历它的数据来查找空间,点击覆盖的空间,因为你覆盖了它,破坏了堆,这将是荒谬的.
根据实现,这样的错误也可能是由于双重免费造成的.
通常的原因是你写了数据,malloc()没有给你写权限 - 缓冲区溢出(写入超出你给出的空间的末尾)或缓冲区欠载(在缓冲区启动之前写入) ).
它有时可能是由释放malloc()等未分配的指针,或者通过重新释放(双重释放)由malloc()分配的指针引起的.例如,释放静态缓冲区是一个坏主意; 你会受到腐败.
您应该假设问题出现在您的代码中 - 它在malloc()等中极不可能出现问题,而且不太可能出现在您正在使用的任何其他库中.