【问题标题】:Windows - SQLite Active Critical SectionWindows - SQLite 活动临界区
【发布时间】:2015-05-14 10:47:43
【问题描述】:

我在 testlib.dll 中使用 SQLite3 3.8.8.2,它有一个导出函数 void DoDBOperation(),它只是打开数据库然后关闭它。我编写了一个 EXE,它使用 LoadLibararyEx() 加载 DLL,调用函数 DoDBOperation(),最后使用 FreeLibrary() 卸载 DLL。我在循环中执行 10000 次导致内存泄漏。

经过调查,我发现每次加载和卸载testlib.dll都会泄漏一个48字节的临界区DS,正如WinDBG在调查堆后报告的那样。 AppVerifier 也报告正在卸载具有活动临界区的库。

如果我静态链接 DLL,则不会发生此类泄漏。我用谷歌搜索了很多但没有帮助。我尝试调试 sqlite3.c 但没有成功找到泄漏。

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

【问题讨论】:

    标签: c++ windows sqlite


    【解决方案1】:

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

    【讨论】:

    • 谢谢,但没有帮助。即使我在 DLL_PROCESS_DETACH 处理程序中调用 sqlite3_shutdown,在 windbg 中仍然可以看到关键部分。我认为 CS 是在进程地址空间中创建的,即使它在 DLL 中。因此,一旦 DLL 与进程分离,就会调用 DLL_PROCESS_DETACH 处理程序,但 sqlite3_shutdown() 仍然使 CS(1 个或多个,我不知道)处于活动状态。
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2013-03-26
    • 2013-04-07
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多