这是我的代码的一部分:
int Parser::SomeFunction(const QString &line, int start, int& fieldStart, int& fieldLength ) const
{
int end;
......
if (0 == m_pRegExp)
{
......
}
else
{
#ifdef KNOWN_PATTERN
end = 19;
#else
QRegularExpressionMatch match = m_pRegExp->match(line, start);
if (!match.hasMatch())
{
return 0;
}
// currently we are requiring match to be found exactly at the position 'start'
if (match.capturedStart() != start)
{
return 0;
}
end = match.capturedEnd();
#endif
}
.....
}
程序加载一个文本文件并逐个解析它的行。 “else”范围中代码的整个目的是计算传递给函数的下一行中字段结束的位置(整数“结束”)。当我使用KNOWN_PATTERN #defined进行编译并加载一些测试文件时,我知道'end'应该变为19,我的程序比没有KNOWN_PATTERN #defined时编译的内存消耗大约400 MB。 400 MB是我的测试文件的所有行都占用在内存中(我可以根据文件大小计算它,也可以在加载文件和解析开始之前观察内存消耗)。 所以在我看来,QRegularExpressionMatch会创建每一行的副本而不会释放它。 我在这里错过了什么? 谢谢!
答案 0 :(得分:1)
任务管理器和类似工具是非常钝的工具,用于观察C ++运行时的内存分配。
特别是,运行时并不一定会将释放的内存释放回操作系统,因为操作系统内存分配在许多平台上相对较慢,但它本身就保留了它。