2016-09-08 140 views
0

我是C++和微軟Visual Studio的新手,我目前正在爲我的數據結構類做一個實驗,我已經完成了我的代碼,但是當我構建並運行我的程序時,會拋出以下錯誤:沒有足夠的內存分配?

std::bad_alloc at memory location 0x0018C9C0. 

我googled這個錯誤,我發現如果沒有足夠的內存分配給程序或程序試圖分配無限量的內存的東西,則會引發此錯誤。我試圖在程序屬性中分配更多內存,但這似乎沒有幫助。查看我的代碼,我找不到任何會引發此錯誤的內容。這裏是我的代碼以供參考:

#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    string value; 
    string linesArray[200]; 
    int i = 0; 
    int j = 0; 
    int finalLine = 158; 

    getline(cin, line, '\n'); 
    getline(cin, line, '\n'); 

    /* First Line */ 
    for (i; i < finalLine; ++i) { 
     getline(cin, line, '\n'); 

     for (j; j <= 24; ++j) { 
      if (j = 0) { 
       line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
      } 
      line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     } 
     linesArray[i] = value; 
     cout << linesArray[i] << endl; 
    } 

    return 0; 
} 

我試圖創建一個指向發現,它顯示了錯誤的地址,但我無法找到它。任何幫助是極大的讚賞。

編輯:對不起,我沒有讓自己清楚,我的輸入是格式爲csv的txt文件。我收集信息,並在每行的第一列中放置30個空格減去值的長度,其餘的值放置20個空格減去值的長度,除非沒有值,其中I用19個空格放置一個零。

示例輸入:

Albania,14,29365,43301,,,,,,,13,27867,41066,,,,,,,1,1498,2235,,, 
+6

'if(j = 0)'這顯然是錯誤的。也許你的意思是'if(j == 0)' – Ari0nhh

+1

只是一個安全的細節,但我建議把finalLine聲明爲const,所以你確定它不會在循環的某個地方展開。 (據我所知,它不是,但它更像是一種安全預防措施,再加上它讓你少擔心一件事) –

+0

你的第一步應該是在調試器中運行你的代碼,並確定代碼中的哪個部分發生錯誤。 – kfsone

回答

2

更改此:

if (j = 0) { 

這樣:

if (j == 0) { 

的一個開始。並再試一次...

我不懷疑你的代碼分配這麼多的內存來拋出std::bad_alloc異常。


當你每次j = 0在星形 *,您創建一個無限循環 ...


注意糾正後,我得到兩個警告的expression result unused,編譯時與-Wall旗,這不是問題的原因,但它會很好理解:

for (j; j <= 24; ++j) { 

並不需要有j那裏產生警告,它這樣寫:

for (; j <= 24; ++j) { 

,因爲你不想初始化j那裏。

+1

無限循環不溢出堆棧。無限*遞歸*沒有。 – Ari0nhh

+0

正確@ Ari0nhh,已更新! – gsamaras

+0

我改變了它,但它仍然拋出錯誤,但位置改變了,所以我想它可能有幫助一個問題 –

1

讓我們爲line="xyz,abc"考慮價值,根據你的代碼,爲j==0,代碼工作,並與line將在','被替換更新值,下面是出放爲'line'第一replace後,

xyz       c 

現在,對於第二次迭代,而更換可變line,你發現了','line.find(','),這是不存在的line字符串和std::find()'將返回std::string::npos,這是在那裏你必須處理異常, 以下網址告訴string::replace,你可以發現,對於pos參數

Position of the first character to be replaced. If this is greater than the string length, it throws out_of_range.

我認爲你現在得到。

1

前兩條getlines是無意義的,它們會被循環中的getline覆蓋。值字符串永遠也不會被分配任何值。然後你正在接受一些輸入,這似乎需要特殊的格式 - 因爲換行對我寫的任何字符串都沒有意義。如果我們要了解你想要做什麼,我們需要知道你輸入字符串的格式。

爲您的循環變量插入打印語句Ĵ任何術後行字符串,像這樣:

/* First Line */ 
for (i; i < finalLine; ++i) { 
    getline(cin, line, '\n'); 
    line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
    cout << "[i=" << i << "] " << line << endl; 
    for (j; j <= 24; ++j) { 
     line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     cout << "[j=" << j << "] " << line << endl; 
    } 
    linesArray[i] = line; 
    cout << linesArray[i] << endl; 
} 

而且,我搬到第一線取代了j的循環。

當我運行代碼時,第一個替換生成了亂碼,這可能對您特殊格式的字符串有更多意義。然後它在第一個j = 0墜毀在內部循環取代。因此,簡而言之,打印每個操作的結果,並且您將更容易看到發生了什麼。

相關問題