我正在开发一个修改大量 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;
}