2015-05-14 27 views
1

我在一个testlib.dll中使用SQLite3 3.8.8.2有一个导出的函数void DoDBOperation(),只是打开数据库,然后关闭它。我写了一个使用LoadLibararyEx()加载DLL的EXE,调用函数DoDBOperation()并最终使用FreeLibrary()卸载DLL。我在循环中做了10000次,导致内存泄漏。Windows - SQLite的活动关键部分

经过调查,我发现每次加载和卸载testlib.dll时,都会在调查堆后泄漏由WinDBG报告的48字节的关键段DS。 AppVerifier也报告库正在被卸载并具有活动的关键部分。

如果我静态链接DLL这种泄漏不会发生。我GOOGLE了很多,但没有帮助。我试图调试sqlite3.c,但没有成功找到泄漏。

有人可以提供一些指针在这个问题上?任何帮助,将不胜感激。谢谢!!

回答

0

您应该在dll卸载时调用sqlite3_shutdown以正确清理它分配的资源(例如,在DLL_PROCESS_DETACH处理程序中)。

+0

谢谢,但它没有帮助。即使我在DLL_PROCESS_DETACH处理程序中调用sqlite3_shutdown,临界区仍然会出现在windbg中。我认为CS是在进程地址空间中创建的,即使它在DLL中。所以一旦一个DLL被从进程中分离出来,DLL_PROCESS_DETACH处理程序被调用,但sqlite3_shutdown()仍然离开CS(1个或更多,我不知道)处于活动状态。 – Abhay