使用UMDH诊断Windows中的内存泄漏 作为预Req:我对C++ +C.P/P比较陌生 我使用一个服务器端C++应用程序,它最近内存泄漏很大。在UMDH的帮助下,我能够诊断并随后修复内存泄漏。泄漏发生在一个用C编写的主要DLL中。在更正此问题后,我开始查看UMDH报告的其他潜在泄漏。下一个报告的最大泄漏似乎来自Maria DB连接器库->为了与SQL DB交互,我们使用LoadLibraryA加载Maria DB连接器库。这就是我们进入DLL后其中一个调用堆栈的样子: libmariadb!_heap_alloc_base+0000005D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\malloc.c, 55) libmariadb!_heap_alloc_dbg_impl+0000028D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 431) libmariadb!_nh_malloc_dbg_impl+00000039 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 239) libmariadb!_nh_malloc_dbg+00000049 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 302) libmariadb!malloc+0000002A (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgmalloc.c, 56) libmariadb!my_malloc+0000009A (c:\mariadb-connector-c-2010\libmariadb\my_malloc.c, 36) libmariadb!alloc_root+00000101 (c:\mariadb-connector-c-2010\libmariadb\my_alloc.c, 81) libmariadb!mthd_stmt_read_all_rows+000000C9 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 181) libmariadb!mysql_stmt_store_result+000003E6 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 1357) 我们传递了一个指向DLL函数的指针,最终返回一个在我们的C++ DLL调用中的另一个DLL函数(MySqLyStMTFReluRESULT),释放由上面提到的初始调用栈中传递的标识符指向的内存。在进行了一些调试之后,我确认析构函数正确地调用了DLL函数来执行清理,并且清理成功

使用UMDH诊断Windows中的内存泄漏 作为预Req:我对C++ +C.P/P比较陌生 我使用一个服务器端C++应用程序,它最近内存泄漏很大。在UMDH的帮助下,我能够诊断并随后修复内存泄漏。泄漏发生在一个用C编写的主要DLL中。在更正此问题后,我开始查看UMDH报告的其他潜在泄漏。下一个报告的最大泄漏似乎来自Maria DB连接器库->为了与SQL DB交互,我们使用LoadLibraryA加载Maria DB连接器库。这就是我们进入DLL后其中一个调用堆栈的样子: libmariadb!_heap_alloc_base+0000005D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\malloc.c, 55) libmariadb!_heap_alloc_dbg_impl+0000028D (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 431) libmariadb!_nh_malloc_dbg_impl+00000039 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 239) libmariadb!_nh_malloc_dbg+00000049 (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c, 302) libmariadb!malloc+0000002A (f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgmalloc.c, 56) libmariadb!my_malloc+0000009A (c:\mariadb-connector-c-2010\libmariadb\my_malloc.c, 36) libmariadb!alloc_root+00000101 (c:\mariadb-connector-c-2010\libmariadb\my_alloc.c, 81) libmariadb!mthd_stmt_read_all_rows+000000C9 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 181) libmariadb!mysql_stmt_store_result+000003E6 (c:\mariadb-connector-c-2010\libmariadb\my_stmt.c, 1357) 我们传递了一个指向DLL函数的指针,最终返回一个在我们的C++ DLL调用中的另一个DLL函数(MySqLyStMTFReluRESULT),释放由上面提到的初始调用栈中传递的标识符指向的内存。在进行了一些调试之后,我确认析构函数正确地调用了DLL函数来执行清理,并且清理成功,c++,c,dll,memory-leaks,mariadb,C++,C,Dll,Memory Leaks,Mariadb,我们正在动态链接Maria DB Connector DLL,因此这使我相信此DLL使用的堆与加载它的DLL使用的堆不同(如果这是错误的,请更正我)。如果这是真的,我想知道当UMDH使用堆管理器的工具获取有关调用堆栈/未完成分配的信息时,这是否会导致问题?从我所读到的内容来看,与进程相关联的所有堆似乎都应该在这里说明。我希望一个更有经验的人能提供一些关于这个话题的见解 编辑(分辨率): 经过进一步审查,我不再认为这是一个误报,似乎代码没有取消分配语句句柄,您可以使用来完成这一点。因此,我的怀疑是

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

编辑(分辨率):


经过进一步审查,我不再认为这是一个误报,似乎代码没有取消分配语句句柄,您可以使用来完成这一点。因此,我的怀疑是错误的,UMDH占了上风。

“此DLL使用的堆与加载它的DLL使用的堆不同”-这并不罕见。事实上,这是正常的:(好的,这是我所期望的,因为在整个运行时使用了许多不同的Windows DLL。