【问题标题】:MySQL cpp connector resultset memory leak?MySQL cpp 连接器结果集内存泄漏?
【发布时间】:2013-07-27 16:45:39
【问题描述】:

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

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

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

TIA!

【问题讨论】:

  • 自发布以来,我发现替换:“v_sql_area.v_res->getBlob("field_name")->get(buffer, 2048);"使用“istream *blob_ret = (v_sql_area.v_res->getBlob("field_name")); blob_ret->get(buffer, 2048); 删除 blob_ret;”似乎可以解决(或至少破解)这个问题。仍然欢迎任何其他解决方案!

标签: c++ mysql memory resultset


【解决方案1】:

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

否则我会导致内存泄漏。

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

【讨论】:

    【解决方案2】:

    是的,看来我们需要释放内存。这是代码(对于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));
    }
    /* }}} */
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2023-03-17
      相关资源
      最近更新 更多