0

私は C++ と、言語の作成とデバッグに必要なメモリのニュアンスに不慣れです。次のコードでセグメンテーション違反が発生する理由を誰か教えてもらえますか?

string Polynomial::toString(){
    int i, exponent;
    stringstream result;

    for (i = 0; i < coeffs.size(); i++){

        // For first non-zero coefficient
        if (result.str().empty()){
            if(coeffs[i] < 0)
                result << "-";
            if(coeffs[i] != 0)
                result << coeffs[i];
        }
        else{
            if(coeffs[i] < 0)
                result << " - " << abs(coeffs[i]);
            else if(coeffs[i] > 0)
                result << " + " << coeffs[i];
        }

        exponent = (coeffs.size() - i - 1);
        if (coeffs[i] != 0){
            if (exponent > 1)
                result << coeffs[i] << "x^" << exponent;
            else if(exponent == 1)
                result << coeffs[i] << "x";
        }
    }

    result.str();
}
4

2 に答える 2

3

おそらく関数を呼び出して、結果を何かに割り当てています。

Polynomial p = ....;
std::string s = p.toString();

には return ステートメントがないためPolynomial::toString()、それ自体が未定義の動作であるため、これにより簡単にセグメンテーション違反が発生する可能性があります。stringstreamsの `stringを返すことで、これを簡単に修正できます。

return result.str();
于 2012-10-17T06:05:06.440 に答える
1

関数に return ステートメントがありません (おそらくそのreturn部分だけ)。main標準によると、以下に示す C++11 標準の §6.6.2/2 に従って、戻り値の型を持つ関数以外の関数で右中括弧に到達することは未定義の動作であり、通常はクラッシュが発生しますが、必ずしもそうではないかもしれません。

それ以外には、未定義の動作やクラッシュを引き起こす可能性のあるものは何もありません。あなたがしたいのは、returnパーツを追加することです:

return result.str();

価値があるのは、GCC 4.7.2 が次の警告を表示することです。

警告: 非 void [-Wreturn-type] を返す関数に return ステートメントがありません

コンパイラが表示する可能性のある、また表示する警告を常に利用してください。


標準参照:

関数の最後を流れることは、値を持たない戻りと同じです。これにより、値を返す関数で未定義の動作が発生します。

于 2012-10-17T06:03:57.617 に答える