sqlite3 C API不会在sqlite3_close上释放内存

时间:2017-01-31 14:03:08

标签: c++ linux sqlite

我有一个服务器应用程序,它存储了某个池中的所有连接。在丢失它与另一个应用程序的连接后,我的应用程序会破坏网络连接对象所需的所有对象。因此,所有对象都被成功销毁,并且数据库连接池也被破坏,但内存未被释放。

池中的连接存储如下:

std::unordered_map<int, DbConnection> connections;

破坏sqlite数据库连接就像:

if (sqlite3_close(sqliteDB) != SQLITE_OK)
{
    printf(errormsg);
}

问题是sqlite3_close在这种情况下总是返回SQLITE_OK。所以它应该释放内存,但它不会这样做。每次重新连接后,我的应用程序消耗的内存量几乎增加了两倍!它肯定是sqlite的内存未发布,而不是其他东西。但是当我使用massif(valgrind工具)运行我的应用程序时,一切正常,并且根本没有内存泄漏。所以我无法理解如何解决这个问题。我正在使用fedora 19,但它可能会在每个Linux分发版上触发此错误。

有人知道问题是什么吗?

1 个答案:

答案 0 :(得分:0)

这是因为内存碎片,这就是为什么操作系统不会立即释放它。 malloc_trim(0)可以帮助解决这个问题,但后来出现了完全碎片化内存的问题。但这是另一个话题。