2

我正在开发一个修改大量 xml 文件的控制台 Qt 应用程序。我注意到随着时间的推移,我的应用程序开始消耗越来越多的内存。例如,它已经工作了一个小时,内存消耗从 300 Mb 增加到 700 Mb。

我在 Qt Creator 分析模式下使用 valgrind 来了解发生了什么。valgrind 日志充满了这样的消息:

155,568 (72 direct, 155,496 indirect) bytes in 9 blocks are definitely lost in loss record 1,104 of 1,107
  in XmlValidator::validateXsd(QString const&, QString const&, QXmlSchema*) in xml_validator.cpp:302
  1: operator new(unsigned long) in /builddir/build/BUILD/valgrind-3.6.0/coregrind/m_replacemalloc/vg_replace_malloc.c:261
  2: /usr/lib64/libQtXmlPatterns.so.4.6.2
  3: /usr/lib64/libQtXmlPatterns.so.4.6.2
  4: /usr/lib64/libQtXmlPatterns.so.4.6.2
  5: /usr/lib64/libQtXmlPatterns.so.4.6.2
  6: /usr/lib64/libQtXmlPatterns.so.4.6.2
  7: /usr/lib64/libQtXmlPatterns.so.4.6.2
  8: /usr/lib64/libQtXmlPatterns.so.4.6.2
  9: QXmlSchema::load(QByteArray const&, QUrl const&) in /usr/lib64/libQtXmlPatterns.so.4.6.2
...

正如我所看到的,所有这些消息都表明QXmlShema::load函数存在问题。我在我的一个函数中使用QXmlShema对象,它是一个本地对象,应该在函数结束后销毁。

课程真的有问题QtXmlPatterns还是我没有正确理解 valgring 日志?

- 更新 -

这是我的代码的一部分:

bool Validator::validateXsd(const QString &xsd, const QString &uri)
{
    QXmlSchema schema;
    return this->validateXsd(xsd, uri, &schema);
}

bool Validator::validateXsd(const QString &xsd, const QString &uri, QXmlSchema *schema)
{
    if (schema == NULL)
    {
        return false;
    }

    bool valid = schema->load(xsd.toUtf8(), uri);

    return valid;
}
4

0 回答 0