分段错误:在 C++ 中弹出向量时出现 11

Posted

技术标签:

【中文标题】分段错误:在 C++ 中弹出向量时出现 11【英文标题】:Segmentation Fault : 11 when popping a vector in C++ 【发布时间】:2012-09-26 21:52:13 【问题描述】:

理想情况下,我希望在这个程序中使用一个堆栈,但它不允许我这样做。我不断收到段错误 11。我通过创建一个新向量并将其设置为等于第一个向量然后弹出新向量来解决这种问题。但我最终需要将弹出的向量与第一个向量同步,但它会引发段错误 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;

【问题讨论】:

向量可能是空的。检查一下。 想同样的事情。在使用pop_back()之前检查您的向量是否为空。 我在以前的版本中确实做过检查,我会重试并回复您。 您应该一直进行这些检查,而不仅仅是在出现问题时。 是的,它仍然不工作,除了我不应该能够将一个空向量分配给另一个向量吗? 【参考方案1】:

您不能从 empty 向量中弹出或获取元素。这是未定义的行为,它可能会使您的应用崩溃。

您可以通过检查代码中每个访问之前的长度来验证这是否是问题所在(您只是“随机”选择了最新更新中的一个位置)。看,真的很简单..如果为空就显示错误信息。

【讨论】:

【参考方案2】:
                if(!finalVec.empty())finalVec.pop_back();
                a = "\033[0m" + finalVec.back();              // <-- bug

显然有问题:finalVec.back() 可能不存在:因为刚刚弹出最后一个元素,所以向量可能为空。

【讨论】:

以上是关于分段错误:在 C++ 中弹出向量时出现 11的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 索引程序中使用向量时出现分段错误 11

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 中操作向量时出现分段错误

在 C++ 中使用向量时出现分段错误?

添加向量时出现分段错误。 (C++)

对检索到的向量进行操作时出现分段错误