我有一个应用程序在获取大型结果集时会占用内存(我的blob字段可以轻松运行几千字节)。经过多次搜索,我想我已经跟踪了resultset :: getblob()的泄漏。如果我注释掉getblob行,它会正常运行。如果我将它留在结果集中就可以了,但是一旦我调用了getblob,我就会听到吮吸的声音就是内存沿着管子走下去。
查看连接器的代码,我看到它返回一个“new”istringstream。我认为这是罪魁祸首。这个“新”在哪里被删除?我确实删除了结果集和准备好的声明。也尝试关闭结果集无济于事。我看到的任何例子似乎都无法解决这个问题。
任何人都有/解决此问题的经验吗?
TIA!
答案 0 :(得分:1)
删除getBlob()函数的返回值。
或我导致内存泄漏。
当我删除从getBlob()函数返回的数据流时,内存是稳定的。
答案 1 :(得分:1)
getBlob
的其他文件也通过new
分配):
/* {{{ MySQL_ResultSet::getBlob() -I- */
std::istream *
MySQL_ResultSet::getBlob(const sql::SQLString& columnLabel) const
{
CPP_ENTER("MySQL_ResultSet::getBlob(string)");
/* isBeforeFirst checks for validity */
if (isBeforeFirstOrAfterLast()) {
throw sql::InvalidArgumentException("MySQL_ResultSet::getBoolean: can't fetch because not on result set");
}
return new std::istringstream(getString(columnLabel));
}
/* }}} */
由于没有内部跟踪,调用者需要释放内存。有人会认为他们可以跟踪这些记忆并在破坏时释放它,但我想他们有他们的理由。