我试图在Linux上的嵌入式C ++应用程序中使用简单的SQLite数据库。我有数据库在功能上工作,但是当我尝试更新表中的记录时,我似乎得到了奇怪的内存使用问题。运行此代码时,可用内存以看似不稳定的方式下降。我会发布一个情节,但我没有足够的声誉。
sqlite3 *db;
void UpdateValue(int TlmID, std::string Value)
{
int rc;
char *zErrMsg = 0;
string sqlCommand = "UPDATE tlm SET t_val=\"" + Value + "\", t_time=strftime('%Y-%m-%d %H:%M:%f') where t_id=" + to_string(TlmID) + ";";
rc = sqlite3_exec(db, sqlCommand.c_str(), NULL, 0, &zErrMsg);
if( rc != SQLITE_OK )
{
#if DEBUG_LEVEL >= DEBUG_LEVEL_1
cout<<"Error: "<<zErrMsg<<endl;
#endif
sqlite3_free(zErrMsg);
}
else
{
#if DEBUG_LEVEL >= DEBUG_LEVEL_2
cout<<"Successfully updated tlm id "<<TlmID<<endl;
#endif
}
}
但是,如果我注释掉sqlite3_exec命令,那么无内存保持稳定。这让我觉得我错误地使用了sqlite3_exec命令。另外,我尝试在每个sqlite3_exec调用之前和之后关闭并打开数据库,但它没有效果。
我使用了sqlite3_status()来检查SQLITE_STATUS_MEMORY_USED,但是这些值在程序执行时没有改变。
我打开数据库连接:
rc = sqlite3_open(DatabaseName.c_str(), &db);
我在做什么会导致此代码的内存消耗不稳定?非常感谢您的帮助。
更新:我使用的是SQLite版本3.6.2,这可能是问题所在,因为它太旧了。
更新:更新到3.8.1后问题仍然存在。
我测量了每个exec
命令之前和之后的内存使用情况,并获得了一些有趣的结果。大约每四个exec
命令61440字节被消耗并且不被释放。所有其他时间,在命令之前和之后都有相同数量的内存。