使用UMDH诊断Windows中的内存泄漏

作为pre-req:我对C ++ / C相当陌生

我使用最近发生内存泄漏的服务器端C ++应用程序。 在UMDH的帮助下,我能够诊断并修复内存泄漏。 泄漏发生在用C编写的主DLL之一。在纠正这个问题后,我开始回顾UMDH报道的其他潜在泄漏。 下一个最大的报告泄漏似乎来自Maria DB连接器库 - >与SQL DB交互,我们使用LoadLibraryA加载Maria DB连接器库。 一旦我们进入DLL,这就是调用堆栈中的一个:

libmariadb!_heap_alloc_base+0000005D (f:ddvctoolscrt_bldself_64_amd64crtsrcmalloc.c, 55)
libmariadb!_heap_alloc_dbg_impl+0000028D (f:ddvctoolscrt_bldself_64_amd64crtsrcdbgheap.c, 431)
libmariadb!_nh_malloc_dbg_impl+00000039 (f:ddvctoolscrt_bldself_64_amd64crtsrcdbgheap.c, 239)
libmariadb!_nh_malloc_dbg+00000049 (f:ddvctoolscrt_bldself_64_amd64crtsrcdbgheap.c, 302)
libmariadb!malloc+0000002A (f:ddvctoolscrt_bldself_64_amd64crtsrcdbgmalloc.c, 56)
libmariadb!my_malloc+0000009A (c:mariadb-connector-c-2010libmariadbmy_malloc.c, 36)
libmariadb!alloc_root+00000101 (c:mariadb-connector-c-2010libmariadbmy_alloc.c, 81)
libmariadb!mthd_stmt_read_all_rows+000000C9 (c:mariadb-connector-c-2010libmariadbmy_stmt.c, 181)
libmariadb!mysql_stmt_store_result+000003E6 (c:mariadb-connector-c-2010libmariadbmy_stmt.c, 1357)

我们传递一个指向DLL函数的指针,最终其中一个析构函数返回到我们的C ++ DLL调用的另一个DLL函数(mysql_stmt_free_result)中,以释放由传入上述初始调用堆栈的标识符指向的内存。 在做了一些调试之后,我确认了析构函数正确地调用了DLL函数来执行清理并且成功了。

我们正在动态链接Maria DB连接器DLL,因此这让我相信这个DLL正在使用的堆与装载它的DLL正在使用的堆不同(请纠正我的错误)。 如果这是真的,我想知道当UMDH使用堆管理器的工具来获取有关调用堆栈/未完成分配的信息时,这是否会引起问题? 从我读过的内容看来,与流程相关的所有堆应该在这里说明。 我希望一个更有经验的人能够就这个话题提供一些见解。

编辑(分辨率):

经过进一步的审查,我不再相信这是一个误报,看起来代码并未取消分配语句句柄,您可以使用mysql_stmt_close来完成此操作。 所以我的怀疑是不正确的,UMDH占了上风。

链接地址: http://www.djcxy.com/p/91035.html

上一篇: Diagnosing memory leaks in Windows with UMDH

下一篇: C# out of memory after calling a memory