私はいくつかのプール内のすべての接続を格納するサーバーアプリケーションを持っています。他のアプリへの接続が失われた後、私のアプリはネットワーク接続オブジェクトに必要なすべてのオブジェクトを破棄します。したがって、すべてのオブジェクトが正常に破棄され、db接続プールも破棄されますが、メモリは解放されません。プール内sqlite3 C APIはsqlite3_closeのメモリを解放しません
接続は、同様に保存されている:のSQLite DB接続の
std::unordered_map<int, DbConnection> connections;
破壊は次のようである:
if (sqlite3_close(sqliteDB) != SQLITE_OK)
{
printf(errormsg);
}
問題は、この場合にSQLITE_OKを返す常にsqlite3_closeあります。だから、メモリを解放するはずですが、それはしません。そして再接続するたびに、私のアプリが消費するメモリ量はほぼ2倍に増えます!間違いなくsqliteのメモリはリリースされておらず、別のものではありません。しかし、私が大規模なツール(valgrindツール)で私のアプリケーションを実行すると、すべて正常に動作し、メモリリークは全くありません。だから私はこの問題を解決する方法を理解することはできません。私はfedora 19を使用していますが、すべてのLinuxディストリビューションでこのエラーを引き起こす可能性があります。
問題が何であるかは誰か知りませんか?
OSは無料でメモリをただちに取り戻すことは保証しません。実際には、ほとんどの時間はそうしないと信じています。どのくらい正確にメモリ使用量を測定していますか? – SingerOfTheFall
htopまたはtop on linux。 valgrind-massifで測定したdb接続プールIのメモリ使用量。 – slowcheetah