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

C++ 分段错误:在C+中弹出向量时为11+;,c++,vector,segmentation-fault,C++,Vector,Segmentation Fault,理想情况下,我希望在这个程序中使用一个堆栈,但它不允许我使用。我一直收到段错误11。我通过创建一个新的向量并将其设置为等于第一个向量,然后弹出新的向量来解决这个问题。但我最终需要将弹出的向量与第一个向量同步,但它会抛出一个段错误11 无论如何,这里是代码,它是另一个项目的一部分,但我不认为上下文太重要,不知道它的用途。而且,当我运行这个方法时,它会抛出错误 void print_well_formed_file(ifstream& ifs) { vector<string&g

理想情况下,我希望在这个程序中使用一个堆栈,但它不允许我使用。我一直收到段错误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;
}
void打印格式良好的文件(ifstream和ifs){
向量向量机;
向量finalVec;
弦线;
字符串a;
字符串温度;
弦乐决赛;
Lexer-Lexer;
令牌tok;
while(getline(ifs,line)){
lexer.set_输入(行);
while(lexer.has_more_token()){
tok=lexer.next_token();
开关(托克型){
案例标签:
如果(托克值[0]!='/')){
a=(tok.值);
如果(a=“红色”){
a=“\033[31m”;
}
如果(a==“绿色”){
a=“\033[32m”;
}
如果(a=“蓝色”){
a=“\033[34m”;
}
如果(a==“黄色”){
a=“\033[33m”;
}
如果(a==“洋红色”){
a=“\033[31m”;
}
如果(a==“青色”){
a=“\033[36m”;
}
如果(a==“dim”){
a=“\033[2m”;
}
如果(a==“下划线”){
a=“\033[4m”;
}
如果(a=“明亮”){
a=“\033[1m”;
}
向量推回(a);
最终=温度+a;
}
否则{
字符串s;
字符串温度;
弦鳍;
finalVec=vec;
如果(!finalVec.empty()){finalVec.pop_back();}
a=“\033[0m”+finalVec.back();
温度=最终温度;
最终=温度+a;
如果(!vec.empty()){vec.pop_back();}//引发错误
vec=finalVec;//引发错误
}
打破
案例识别:
a=(tok.value)+”;
温度=最终温度;
最终=温度+a;
打破
}
}
}

cout您无法从空向量中弹出或获取元素。这是未定义的行为,可能会使您的应用程序崩溃

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

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

a=“\033[0m”+finalVec.back();//向量可能是空的。请检查它。考虑相同的问题。在使用
pop_back()之前,请检查向量是否为空
。我在以前的版本中对此进行了检查,我会重试并返回给您。您应该一直执行这些检查,而不仅仅是在出现故障时。是的,它仍然不起作用,而且我不应该将一个空向量分配给另一个向量吗?