2014-02-12 13 views
-2

我正在構建一個小型的C++程序,需要使用一個雙端機來管理一些動態數據。我構建了腳本,並且在少量數據放入和移出雙端隊列時工作良好,但是當存儲大量數據時,程序錯誤會導致內存錯誤。下面是相關代碼:C++程序中的內存錯誤看起來是由deque造成的

string curLine; 

    deque<string> lineBuffer(context); 
    int linesAfterContext = 0; 

    ifstream newFile; 
    istream *in; 

    if (input == NULL) { 
    in = &cin; 
    } 
    else { 
    newFile.open(input); 
    in = &newFile; 
    if (newFile.fail() || !newFile.is_open()) { 
     string error = "Not able to open that file. Please provide a valid file."; 
     throw error; 
    } 
    } 

    while(in->good()) { 
    getline(*in, curLine); 

    if (doesLineMatch(curLine)) { 
     if (linesAfterContext == 0) { 
     for (int i = 0; i < lineBuffer.size(); i++) { 
      string curLineInBuffer = lineBuffer.at(i); 
      if (!curLineInBuffer.empty()) { 
      cout << lineBuffer.at(i) << endl; 
      } 
     } 
     } 

     cout << curLine << endl; 

     linesAfterContext = context; 
    } 
    else { 
     if (linesAfterContext > 0) { 
     cout << curLine << endl; 
     linesAfterContext--; 
     } 

     if (lineBuffer.size() == context) { 
     lineBuffer.pop_front(); 
     } 

     lineBuffer.push_back(curLine); 
    } 
    } 

    if (input != NULL) { 
    newFile.close(); 
    } 

清楚的問題是我如何推動和坡平的雙端隊列,因爲當我註釋掉那些四行內存故障不會再發生。任何想法爲什麼這些線會泄漏內存?

編輯:

好的,所以我只是發佈了完整的代碼。我在原始代碼中編輯了一些變量,而沒有考慮它們對內存管理的影響。我是一個C + +(或C任何真正證明= P)的新手,所以我敢肯定這是我的代碼不是deque的問題。對此感到抱歉。

+1

你確實需要顯示你已經明確從示例中刪除的代碼。什麼「改變curline」呢? 「做什麼」執行什麼動作?既然'curLine'是一個指針,我保證你正在做一些有趣的事情,而這與使用'deque'無關。 – paddy

+0

專家設計的'std :: deque'沒有內存泄漏。停止指責工具,並開始考慮你可能有錯。內存泄漏在_your_代碼中。現在,發佈一個測試用例。 :) –

+0

你有''''deque 012BFB(上下文);''但是你推''lineBuffer.push_back(curLine);''curline是字符串* – Krypton

回答

1

從你的引擎收錄鏈接,

http://pastebin.com/Jp1RgwqV

請看看你的parseInt函數()函數。你正在返回一個局部變量的地址,這是一個禁忌。

int * parseInt(char *contextArg) { 
    int resultingNumber = 0; 
    //... 
    int *endResult; 
    endResult = &resultingNumber; 
    return endResult; 
} 

在這裏看到:

Returning local data from functions in C and C++ via pointer

我會建議你更熟悉指針,該做的和不指針的使用的。

+0

我也建議在你的程序的任何地方刪除s​​trlen()或C字符串函數的用法,以及「new char [whatever]」。在你的程序中沒有必要這樣做。實際上,程序中的任何字符串操作都可以使用std :: string來完成。 – PaulMcKenzie

相關問題