0

我尝试使用 nedmalloc 的调试功能在我的代码中查找潜在的内存泄漏。所以我激活了标志ENABLE_LOGGINGNEDMALLOC_TESTLOGENTRY.

在我的程序中,我只使用系统内存池。在我的程序的最后,我调用该函数neddestroysyspool以刷新所有内存事件。

首先,我无法激活堆栈跟踪功能。当我改变这个深度时,程序在几次分配后崩溃。为了在 VS2010 下编译,我必须DeinitSym通过调用来定义自己CloseHandle;我希望我做得对……但它不能正常工作。所以我不使用它。

所以我只解析文件nedmalloc.csv:我对它进行排序,这要归功于地址、分配的大小和减去地址中释放的大小。由于未知原因,对于几个大块(大小> 400kb),分配时给出的大小是正确的,但空闲时给出的大小不同,高于分配的大小。例如,我分配了一个 840352 字节的块,但释放时,记录的大小为 851932 字节。是正常的吗?

有人对这个问题有一些答案或提示吗?

4

1 回答 1

1

首先,我真的不会使用 nedmalloc 的日志记录工具来检测内存泄漏。valgrind 是一种非常优越的查找资源泄漏的方法。我什至在 nedmalloc 中有一个 hack,让它使用系统分配器而不是 dlmalloc 来精确地利用 valgrind。

其次,是的,堆栈回溯代码可能有点脆弱。如果我没记错的话,我做了一些顽皮的事情来获得更高的性能,但代价是它不能很好地工作。我会直言不讳地说几乎没有人,但我曾经使用过那个代码路径,所以我从来没有太多理由正确调试它。它对我的目的来说已经足够好了。

第三,对于较大的块,dlmalloc 会将分配包括它们的簿记四舍五入到 64Kb 倍数,因此预计 12 块分配将变成 13 块分配。

最后,作为 nedmalloc 的作者,我建议您不要在 Windows 7 或更高版本、任何具有 3.x 内核的 Linux 或过去三年生产的任何 Mac OS X 上使用 nedmalloc。为什么?系统分配器可能已经足够好,而且我个人已经有好几年不需要 nedmalloc 了,我承认代码有点烂。

希望有帮助。

尼尔

于 2013-12-04T22:32:53.513 回答