内存损坏是由无效*读取*释放内存引起的?

我越来越

*** glibc检测到***(/ my / program / …):malloc():内存损坏:0xf28000fa ***

我已经在valgrind下运行,它报告已经被释放的内存的情况,但没有非法内存写入的情况

可以读取释放内存导致内存损坏? 如果不是的话,还有什么build议可以在valgrind之外的地方看看?

您可以使用GDB来监视这个内存地址中的每个写入,如下所示:

(gdb) watch *((int*)0xf28000fa) 

然后你可以调试问题出在哪里。

阅读不会造成记忆腐败,但有很多情况下,你甚至不会想到这可能是造成这种情况的原因,Valgrind不是一个完美的工具。

查看更多关于调试内存问题的信息 。

它不会破坏你读的内存,但是对你的程序的运行不会有奇迹。

读取释放的内存也被认为是内存损坏。

您也可以查看http://en.wikipedia.org/wiki/Memory_corruption

不,阅读无效位置不可能导致您所看到的错误。 如果该地址在您的地址空间中有效,那么您只会阅读垃圾邮件,如果不是,则会出现分段错误。

检查valgrind的输出以查看无效的读取来自哪里 – 这会给你提示真正的错误所在。 一旦你发现这个,我很确定真正的罪魁祸首不会太远,这可能是一个无效的写。

在当前的处理器上不应该那么普遍,但是我已经在平台上工作,即使是读操作也可以做到这一点。 在具体的6502处理器已经映射了I / O,所以一个具有I / O映射地址的常规“读”指令可以做出令人惊讶的事情。

大约30年前,我被这个问题困扰了,因为我的坏的读取引发了一个存储库切换(即存储器的每个字节,包括代码的区域,在该指令之后得到一个新的不同的值)。 有趣的是,这不是一个真正的“无意的”坏阅读…即使知道这将是垃圾,我实际上做了阅读,因为这节省了我几个汇编指令…不是一个聪明的举动。

真正可以发生的事情是,可以使用madvise(MAD​​V_DONTNEED)系统调用来告诉内核“我不需要这个页面,放下它”(参见madvise(2)手册页)。 如果这个页面真的被释放,并且你从里面读取任何内容,内核会默默地提供一个新的页面,归零 – 从而导致你的应用程序遇到完全意想不到的数据!