我正在开发一个修改大量xml文件的控制台Qt应用程序。我注意到我的应用程序开始消耗越来越多的内存。例如,它已经工作了一个小时,内存消耗从300 Mb增加到700 Mb。
我在Qt Creator Analyze模式中使用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;
}