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您可以通过返回' 字符串轻松解决此问题:

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]

始终利用编译器可以并且将给您的警告。


标准参考:

从函数末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。

于 2012-10-17T06:03:57.617 回答