首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于sqlite3的内存泄漏有关问题

2012-11-06 
关于sqlite3的内存泄漏问题boost::shared_ptrdatabase pDB(new database(test.db))std::string sql

关于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在内存上肯定有其一套管理机制,以便快速进行数据库增删改查。

热点排行