2013-04-15 30 views
0

该程序严格只读取字母,并将其推回到向量中。 但是,文本文件就像任何其他文本文件。STD Bad Alloc异常

我遇到了这种STD坏分配异常,如下所示。

char keyArray[5][5]; 

keyArray[0][1] = 'a'; 
keyArray[0][2] = 'b'; 
keyArray[0][3] = 'c'; 
keyArray[0][4] = 'd'; 
keyArray[0][5] = 'e'; 
keyArray[1][1] = 'f'; 
keyArray[1][2] = 'g'; 
keyArray[1][3] = 'h'; 
keyArray[1][4] = 'i'; 
keyArray[1][5] = 'k'; 
keyArray[2][1] = 'l'; 
keyArray[2][2] = 'm'; 
keyArray[2][3] = 'n'; 
keyArray[2][4] = 'o'; 
keyArray[2][5] = 'p'; 
keyArray[3][1] = 'q'; 
keyArray[3][2] = 'r'; 
keyArray[3][3] = 's'; 
keyArray[3][4] = 't'; 
keyArray[3][5] = 'u'; 
keyArray[4][1] = 'v'; 
keyArray[4][2] = 'w'; 
keyArray[4][3] = 'x'; 
keyArray[4][4] = 'y'; 
keyArray[4][5] = 'z'; 


ifstream readFile; 
vector<char> paddedVector; 
char c; 
int number_of_chars = 0; 
readFile.open ("test.txt", ifstream::in); 
while( !readFile.eof()) 
{ 
    if(readFile.peek() == -1) 
     break; 
    c = readFile.get(); 
    if(!isalpha(c)) 
     continue; 

    if(c != '\n') //bad alloc here 
    { 
     ++number_of_chars; 
     paddedVector.push_back(c); //std bad alloc happens here 
    } 
} 

请注意。

编辑当我拿走keyArray部分时,它工作正常。为什么这样?我在这里做错了什么?

+2

文件的大小是多少? – Shahbaz

+0

@Shahbaz,仅限1kb。 :( – Andres

+1

有趣的是,你的代码在这里工作得很好,你在为我们隐藏什么?:) –

回答

3

你的问题有以下5条线:

keyArray[?][5] = '?'; 

你在哪里索引你的keyArray数组的边界。它可能会覆盖paddedVector对象中的内部指针。当矢量试图(重新)分配内存时,你会得到这个异常,因为delete[]无法理解该地址来自哪里。


注意,出于同样的原因,你从0开始你的第一个指标,你也应该从0开始你的第二个指标!因此,这两个指数应在[0, 5)范围内。

1
char keyArray[5][5]; 
// ... 
keyArray[4][5] = 'z'; 

上述写入超过数组的末尾。 keyArray的有效索引是keyArray[0..4][0..4]。你的程序处于未定义的行为状态。

1

您错误地处理了内部数组。它们也是基于0的,所以格式应该是

keyArray[0][0] = 'a' 
. 
. 
. 
keyArray[4][4] = 'z'