1

このプログラムで 1 つのスタックを使用したいのですが、それができません。セグメント エラー 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;
}
4

2 に答える 2

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

明らかにバグfinalVec.back()があります:存在しない可能性があります:最後の要素がポップされたばかりなので、ベクトルは空である可能性があります。

于 2012-09-26T22:35:39.370 に答える
1

空のベクターから要素をポップまたは取得することはできません。これは未定義の動作であり、アプリがクラッシュする可能性があります。

コード内の各アクセスの前に長さをチェックすることで、これが問題であることを確認できます (最新の更新で場所の 1 つを「ランダムに」選択しただけです)。ほら、本当に簡単です.空の場合はエラーメッセージを表示するだけです。

于 2012-09-26T22:09:25.760 に答える