C++ SQLite是否使用SQLCipher扩展泄漏内存?
我用它来存储一个加密的数据库。但是,当我使用C++ SQLite是否使用SQLCipher扩展泄漏内存?,c++,c,memory-leaks,sqlite,sqlcipher,C++,C,Memory Leaks,Sqlite,Sqlcipher,我用它来存储一个加密的数据库。但是,当我使用sqlite3\u key加密数据库时,我开始出现内存泄漏。观察以下样本: #include <sqlite3.h> int main() { sqlite3 * connection; sqlite3_open_v2(":memory:", &connection, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); sqlite3_key(con
sqlite3\u 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);
}
#包括
int main()
{
sqlite3*连接;
sqlite3_open_v2(“:内存:,&连接,SQLITE_open_READWRITE | SQLITE_open_CREATE,NULL);
sqlite3_键(连接,“密码短语”,10);
sqlite3_关闭(连接);
}
此示例产生内存泄漏。如果我删除对sqlite3\u键的调用
,内存泄漏就会消失
我已经缩小了一些可能的罪魁祸首:
- 尽管示例使用内存中的数据库(因此
),但在使用基于文件的数据库时,我看到了相同的结果”:memory:“
- 来自
调用的所有返回代码都是sqlite3.*
,这意味着没有任何错误SQLITE\u OK
的“密码短语”
缓冲区长度不是问题所在10
我正在使用一个。我进一步研究了这个问题,这些报告的泄漏是OpenSSL分配内存的结果。由于SQLCipher不知道什么时候严格使用它来完成应用程序,因此不会调用EVP_cleanup(),valgrind会将内存报告为泄漏。我们正在努力实现一个简单的修复,该修复将尝试通过一些简单的引用计数来识别SQLCipher何时不再使用OpenSSL结构,因此可以自动调用
EVP_cleanup()
在下一版本的SQLCipher发布之前,您可以在退出之前在程序中手动调用
EVP_cleanup()
。如何检测内存泄漏_CrtDumpMemoryLeaks()?是的,在Boost单元测试框架内。在运行最新repo代码的Linux上,上述代码没有问题。@netcoder,您是如何检查内存泄漏的?值得注意的是,SQLCipher还有一个测试套件,我们在每次发布之前都会运行该测试套件,用于检查所有操作的内存泄漏,而且它显示当前代码库没有泄漏。IIRC,_CrtDumpMemoryLeaks()因错误报告并非真正泄漏的泄漏而臭名昭著。