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

c – SQLite是否使用SQLCipher扩展名泄漏内存?,第1张

概述我使用 SQLCipher来存储加密的 SQLite数据库.但是,当我使用sqlite3_key加密数据库时,我开始收到内存泄漏.请注意以下示例: #include <sqlite3.h> int main(){ sqlite3 * connection; sqlite3_open_v2(":memory:", &connection, SQLITE_OPEN_READ 我使用 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不是问题.

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

有谁之前经历过这个吗?有没有办法摆脱泄漏?即使这不是官方的内存泄漏,也很难用这种方法检测真正的内存泄漏.

我正在使用SQLCipher library for Windows.

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

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

@H_502_37@ 总结

以上是内存溢出为你收集整理的c – SQLite是否使用SQLCipher扩展名泄漏内存?全部内容,希望文章能够帮你解决c – SQLite是否使用SQLCipher扩展名泄漏内存?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1230353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存