关于sqlite3的内存泄漏问题
boost::shared_ptr<database> pDB(new database("test.db"));
std::string sql = "CREATE TABLE IF NOT EXISTS ";
sql += "Student";
sql += " (ID INTEGER, Name TEXT)";
pDB->execute(sql);
sql = "INSERT INTO Student (ID, Name) VALUES (1, \'Bob\')";
for (int i = 0; i < 1000; ++i)
{
for (int j = 0; j < 1000; ++j)
{
// pDB->connect("test.db");
pDB->execute(sql);
// pDB->disconnect();
}
}
database是自己封装一个简单的类,其中execute函数如下:
bool database::connect(const std::string &db_file)
{
disconnect();
bool bRet = true;
int rc = SQLITE_OK;
bool continue_loop_flag = true;
while (continue_loop_flag)
{
rc = sqlite3_open(db_file.c_str(), &db_);
switch (rc)
{
case SQLITE_OK:
{
continue_loop_flag = false;
break;
}
case SQLITE_BUSY:
{
boost::this_thread::sleep(boost::posix_time::milliseconds(
SQLITE_EXEC_BUSY_WAIT_TIME));
break;
}
default:
{
#ifdef _DEBUG
std::cerr << rc << ": ";
std::cerr << this->error_msg() << std::endl;
std::cerr << "FATAL ERROR Happens" << std::endl;
#endif
continue_loop_flag = false;
bRet = false;
break;
}
}
}
return bRet;
}
上面的示例内存稳定于一个值。
如果没有注释掉上面两行,内存就会一直以4K的速度增长,请问是什么原因啊?
[解决办法]
disconnect
里有没有sqlite3_close
[解决办法]
conect需要放在循环里面吗?移到外面
[解决办法]
实在找不出问题就使用检测工具
[解决办法]
看了你的代码和运行结果,你看是否有这种可能,排除sqlite3的泄露这个可能,由于sqlite3是内存数据库,所以,你在不断插入数据时,sqlite3也许要不断增大内存空间来存储数据。sqlite3在内存上肯定有其一套管理机制,以便快速进行数据库增删改查。