1

我有一个应用程序在获取大型结果集时会占用内存(我的 blob 字段可以轻松运行几千字节)。经过大量搜索,我想我已经跟踪到 resultset::getblob() 的泄漏。如果我注释掉 getblob 行,它会正常运行。如果我把它留在结果集中也没关系,但是一旦我调用 getblob,我就会听到那种吸吮的声音,那就是记忆从管子里流下来。

查看连接器的代码,我发现它返回了一个“新的”字符串流。我认为这是罪魁祸首。这个“新”在哪里被删除?我确实删除了结果集和preparedstatement。也尝试关闭结果集无济于事。我看到的任何例子似乎都没有做任何事情来处理这个问题。

有人对此有任何经验/解决方法吗?

蒂亚!

4

2 回答 2

1

删除 getBlob() 函数的返回值。

或者我导致内存泄漏。

当我删除从 getBlob() 函数返回的内流时,内存是稳定的。

于 2016-05-30T02:14:40.290 回答
1

是的,看来我们需要释放内存。这是代码(对于 mysql_resultset.cpp,还有其他文件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));
}
/* }}} */

由于没有对此进行内部跟踪,调用者需要释放内存。人们会认为他们本可以追踪这段记忆并在销毁时释放它,但我想他们有他们的理由。

于 2017-04-25T02:38:06.603 回答