我编写了一个控制台应用程序,它通过boost :: interprocess内存接收事件,并将信息转储到sqlite3数据库中。在运行应用程序时,我注意到,在Windows任务管理器中,内存使用量每30秒-1分钟就会周期性地增加。这让我相信问题在于我执行SQL的主循环。我添加了一些监控,显然sqlite3_memory_usage每次循环迭代都会返回增加的结果。
有人可以告诉我,我做错了什么吗?我错过了我应该取消分配的东西吗?
这是我用来生成SQL的两个字符串
const std::string sql_insert =
"INSERT INTO EventsLog "
"(Sec, uSec, DeviceId, PmuId, EventId, Error, Msg) "
"VALUES (%ld, %ld, %ld, %d, %ld, %d, %Q)";
const std::string sql_create =
"CREATE TABLE IF NOT EXISTS EventsLog("
"Id INTEGER PRIMARY KEY AUTOINCREMENT, "
"Sec INTEGER NOT NULL, "
"uSec INTEGER NOT NULL, "
"DeviceId INTEGER NOT NULL, "
"PmuId INTEGER NOT NULL, "
"EventId INTEGER NOT NULL, "
"Error INTEGER NOT NULL, "
"Msg TEXT"
")";
在这里,我生成SQL INSERT命令
std::string construct_sql_query
(const ELMessageData & data)
{
std::string query = "";
ptime jan1st1970 = ptime(date(1970,1,1));
ptime now = boost::posix_time::microsec_clock::universal_time();
time_duration delta = now - jan1st1970;
TimeVal time((uint32)delta.total_seconds(),
(uint32)now.time_of_day().fractional_seconds());
char * const sql = sqlite3_mprintf(sql_insert.c_str(),
time.tv_sec,
time.tv_usec,
data.getDeviceId(),
data.getPmuId(),
data.getEventId(),
(data.getIsError() ? 1 : 0),
data.getExMsg().c_str());
if(sql == NULL)
post_event(EvIOError("Failed to create the SQL command",
"StLoggingEvents::_construct_sql_query"));
query = std::string(sql);
sqlite3_free(sql);
return query;
} // construct_sql_query
这是我执行INSERT命令的主循环
while(true)
{
m_exchange_obj->wait(); // wait for the semaphore to be raised
const std::string sql = construct_sql_query
(m_exchange_obj->receive());
char ** err = NULL;
const int rc = sqlite3_exec(m_db_handle,
sql.c_str(),
NULL,
NULL,
err);
sqlite3_free(err);
if(rc != SQLITE_OK)
{
LERR_ << "Error while inserting into the database";
LERR_ << "Last SQL Query : ";
LERR_ << sql;
}
else
{
LDBG_ << "Event logged...";
LDBG_ << "Sqlite3 memory usage : "
<< sqlite3_memory_used();
}
}
答案 0 :(得分:1)
我第二个建议在valgrind下尝试这个。您可能还想看看google的tcmalloc替换...它可以打印漂亮的图表显示您的所有泄漏...也就是说,我希望您能得到答案...我计划在即将开展的项目中使用SQLite。 ..
答案 1 :(得分:0)
您如何确定内存使用情况?你可能没有真正的泄密。
如果您使用的是Windows系统并使用visual studio,请在调试模式下编译并使用内存调试宏来查找泄漏信息。
如果您使用的是基于unix的系统,请尝试valgrind / memcheck。
我认为OS X的xcode也可以检测泄漏。