SQLite是否使用SQLCipher扩展名泄漏内存?

时间:2012-08-02 18:41:13

标签: c++ c memory-leaks sqlite sqlcipher

我使用SQLCipher存储加密的SQLite数据库。但是,当我使用sqlite3_key加密数据库时,我开始收到内存泄漏。请注意以下示例:

#include <sqlite3.h>    

int main()
{
    sqlite3 * connection;
    sqlite3_open_v2(":memory:", &connection, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    sqlite3_key(connection, "passphrase", 10);
    sqlite3_close(connection);
}

此示例会产生内存泄漏。如果我删除对sqlite3_key的调用,内存泄漏就会消失。

我已经缩小了一些可能的罪魁祸首:

  • 虽然示例使用内存数据库(因此":memory:"),但在使用基于文件的数据库时,我看到相同的结果。
  • 来自sqlite3_*来电的所有返回代码均为SQLITE_OK,这意味着没有任何错误。
  • 10的{​​{1}}的缓冲区长度不是问题。

但是,无论我创建多少个连接或使用多少个不同的加密密钥,内存泄漏总是大约8千字节。这让我怀疑这实际上不是内存泄漏,而只是SQLite / SQLCipher中的一些常量全局内存,并没有手动释放。

以前有没有人经历过这个?有没有办法摆脱泄漏?即使这不是官方的内存泄漏,但现在很难发现真正的内存泄漏。

我正在使用SQLCipher library for Windows

1 个答案:

答案 0 :(得分:2)

我对此进行了进一步调查,这些报告的泄漏是OpenSSL分配的内存的结果。由于SQLCipher不知道应用程序何时严格使用它,因此不会调用EVP_cleanup(),并且valgrind将内存报告为泄漏。我们正在努力寻找一个简单的修复程序,它将尝试通过一些简单的引用计数来确定何时SQLCipher不再使用OpenSSL结构,因此可以自动调用EVP_cleanup()

作为SQLCipher下一版本之前的快速解决方法,您可以在退出前在程序中手动调用EVP_cleanup()