2012-09-26 39 views
1

我希望在這個程序中使用一個堆棧,但它不允許我。我不斷收到段錯誤11.我通過製作一個新的矢量並設置等於第一個矢量然後彈出新矢量來解決這類問題。但我最終需要將彈出的矢量與第一個矢量同步,但它會引發段錯誤11.分割錯誤:在C++中彈出一個向量時出現11錯誤

無論如何,這裏是代碼,它是另一個項目的一部分,但我不認爲上下文太重要,不知道它是什麼對於。這也確實編譯它,只是當我運行這個方法時會拋出錯誤。

void print_well_formed_file(ifstream& ifs) { 
    vector<string> vec; 
    vector<string> finalVec; 
    string line; 
    string a; 
    string temp; 
    string final; 
Lexer lexer; 
Token tok; 
while (getline(ifs, line)) { 
    lexer.set_input(line); 
    while (lexer.has_more_token()) { 
     tok = lexer.next_token(); 
     switch (tok.type) { 
      case TAG: 
       if (tok.value[0] != '/'){ 
        a = (tok.value); 
        if (a == "red") { 
         a = "\033[31m"; 
        } 
        if (a == "green") { 
         a = "\033[32m"; 
        } 
        if (a == "blue") { 
         a = "\033[34m"; 
        } 
        if (a == "yellow") { 
         a = "\033[33m"; 
        } 
        if (a == "magenta") { 
         a = "\033[31m"; 
        } 
        if (a == "cyan") { 
         a = "\033[36m"; 
        } 
        if (a == "dim") { 
         a = "\033[2m"; 
        } 
        if (a == "underline") { 
         a = "\033[4m"; 
        } 
        if (a == "bright") { 
         a = "\033[1m"; 
        } 

        vec.push_back(a); 
        final = temp + a; 
       } 
       else{ 
        string s; 
        string temp; 
        string fin; 

        finalVec = vec; 
        if(!finalVec.empty()){finalVec.pop_back();} 
        a = "\033[0m" + finalVec.back(); 
        temp = final; 
        final = temp + a; 
        if(!vec.empty()){vec.pop_back();} // throws an error 
        vec = finalVec; // throws an error 
       } 
      break; 
      case IDENT: 
       a= (tok.value)+ " "; 
       temp = final; 
       final = temp + a; 
       break; 
     } 
    } 
} 
cout << final << endl; 
} 
+8

該向量可能是空的。覈實。 –

+0

以爲同樣的事情。在使用'pop_back()'之前檢查你的向量是否爲空。 –

+0

我確實在之前的版本中進行過檢查,不適當的重試並回復給您。 –

回答

1

你不能彈出或者從一個向量的元素。這是未定義的行爲,並且可能會導致應用程序崩潰。

您可以通過檢查代碼中每個的訪問權限(您只是「隨機」選擇最近更新中的某個位置)來驗證是否存在問題。看,這很簡單..只是顯示一個錯誤信息,如果它是空的。

1
   if(!finalVec.empty()){finalVec.pop_back();} 
       a = "\033[0m" + finalVec.back();    // <-- bug 

顯然是越野車:finalVec.back()可能不存在:因爲最後一個元素剛剛被彈出的載體可以是空的。