Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLite是否使用SQLCipher扩展泄漏内存?_C++_C_Memory Leaks_Sqlite_Sqlcipher - Fatal编程技术网

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
    缓冲区长度不是问题所在
但是,无论我创建了多少个连接,或者使用了多少不同的加密密钥,内存泄漏总是在8 KB左右。这让我怀疑这实际上不是内存泄漏,而是SQLite/SQLCipher中的一些恒定全局内存,无法手动释放

以前有人经历过吗?有没有办法消除漏洞?即使这不是官方的内存泄漏,也很难用它检测出真正的内存泄漏


我正在使用一个。

我进一步研究了这个问题,这些报告的泄漏是OpenSSL分配内存的结果。由于SQLCipher不知道什么时候严格使用它来完成应用程序,因此不会调用EVP_cleanup(),valgrind会将内存报告为泄漏。我们正在努力实现一个简单的修复,该修复将尝试通过一些简单的引用计数来识别SQLCipher何时不再使用OpenSSL结构,因此可以自动调用
EVP_cleanup()


在下一版本的SQLCipher发布之前,您可以在退出之前在程序中手动调用
EVP_cleanup()

如何检测内存泄漏_CrtDumpMemoryLeaks()?是的,在Boost单元测试框架内。在运行最新repo代码的Linux上,上述代码没有问题。@netcoder,您是如何检查内存泄漏的?值得注意的是,SQLCipher还有一个测试套件,我们在每次发布之前都会运行该测试套件,用于检查所有操作的内存泄漏,而且它显示当前代码库没有泄漏。IIRC,_CrtDumpMemoryLeaks()因错误报告并非真正泄漏的泄漏而臭名昭著。