我主要从事C语言工作。我遇到了很多问题,并花了很多时间来调试与动态分配的内存损坏/覆盖相关的问题。像malloc(A)A字节但使用写入超过A字节。在我读到的时候,我试图阅读一些内容: -
1。)一种方法,其中一个分配比所需内存更多的内存。并在额外的位置写一些已知的值/模式。然后在程序执行期间,该模式应该不受影响,否则它表示内存损坏/覆盖。但是这种方法是如何工作的呢?对于使用malloc()分配的指针的每次写入是否意味着我应该对附加的哨兵模式进行内存读取并读取它的理智?那会让我的整个节目变得非常慢。 并且说我们可以从代码的发布版本中删除这些检查,因为内存相关问题可能在“真实场景”中发生更多,因此也没有成效。我们可以处理这个吗?
2.)我听说有一种称为HEAP WALKER的东西,可以让程序检测与内存相关的问题?如何实现这一点。
谢谢。-AD。
答案 0 :(得分:3)
如果您在Linux或OSX下工作,请查看Valgrind(免费,可通过Macports在OSX上获得)。对于Windows,我们使用Rational PurifyPlus(需要许可证)。
您还可以查看Dmalloc甚至Paul Nettle's memory manager,这有助于跟踪与内存分配相关的错误。
答案 1 :(得分:1)
如果你使用的是Mac OS X,那就是一个名为libgmalloc的精彩库。 libgmalloc将每个内存分配放在一个单独的页面上。超出页面的任何内存访问/写入都会立即触发总线错误。但请注意,使用libgmalloc运行程序可能会导致显着减速。
答案 2 :(得分:0)
内存保护可以捕获一些堆损坏。它速度较慢(尤其是解除分配),但它仅用于调试目的,而您的发布版本不包含此内容。
堆行走是特定于平台的,但不一定太有用。最简单的检查只是将您的分配包装起来并将其记录到一个文件中,其中包含 LINE 和 FILE 信息,以便您的调试模式,并且大多数泄漏都会很快显现出来。退出程序,数字不合适。
在谷歌搜索 LINE ,我相信会有很多结果显示出来。