2013-10-10 153 views
0

這裏是我的代碼部分:QRegularExpressionMatch內存消耗

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創建每一行的副本,並不會釋放它。 我在這裏錯過了什麼? 謝謝!

回答

1

任務管理器和類似工具對於觀察C++運行時的內存分配非常直截了當。

特別是,運行時並不一定會將釋放的內存釋放回操作系統,因爲操作系統內存分配在很多平臺上相對較慢,但對其本身仍然有效。

+0

謝謝molbdnilo你的答案。如果操作系統延遲實際的內存釋放分配比我預期在新的分配請求時重新使用它。但是,我的32位程序在Windows上達到了2Gb的限制,並在加載800MB文件時崩潰 - 僅僅是因爲這些800MB被臨時文件複製,如我所示代碼中的臨時文件,而且沒有被釋放或重用?其次,你能提出一個更好的工具來監視Windows中的實際內存使用情況嗎?謝謝 – mvidelgauz

+0

@mvidelgauz它應該在需要時重複使用,這很奇怪。但是你真的需要一次加載整個800MB嗎?這不是世界上最具可擴展性的想法。 – molbdnilo

+0

它不會像我提到的那樣返回,而且我知道加載整個800 MB通常不是個好主意,但是對於實現目標的最佳方式的特定程序來說 - 該軟件是帶有多個視圖/過濾器的log4j文件查看器/搜索結果以及在每個(單獨過濾)視圖中前後快速瀏覽 – mvidelgauz