0

这是我的代码的一部分:

    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”范围内的代码的全部目的是计算传递给函数的下一行中字段的结束位置(整数“end”)。当我使用 KNOWN_PATTERN #defined 编译并加载一些测试文件时,我知道'end' 应该变为 19,我的程序消耗的内存比不使用 KNOWN_PATTERN #defined 编译时少大约 400 MB。400 MB 是我的测试文件的所有行在内存中占用的内存(我可以根据文件大小计算它,并且我在加载文件和开始解析之前观察内存消耗)。所以在我看来, QRegularExpressionMatch 会创建每行的副本并且不会释放它。我在这里想念什么?谢谢!

4

1 回答 1

1

任务管理器和类似工具是用于观察 C++ 运行时内存分配的非常生硬的工具。

特别是,运行时不一定将释放的内存释放回操作系统,因为操作系统内存分配在许多平台上相对较慢,但会自行保留。

于 2013-10-10T11:52:19.713 回答