【问题标题】:C++ segmentation faultC++ 分段错误
【发布时间】:2012-10-17 05:44:38
【问题描述】:

我不熟悉 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();
}

【问题讨论】:

  • 您能告诉我们coeffs 是在哪里/如何定义的,以及如何用值填充它吗?
  • 请展示更多代码(特别是所有相关类的声明),使用所有警告和调试信息进行编译(例如,Linux 上的g++ -Wall -g)并学习使用调试器(Linux 上的gdb)。
  • 可能是您缺少退货声明。这会导致未定义的行为,这肯定会崩溃。

标签: c++ segmentation-fault


【解决方案1】:

您可能正在调用该函数并将结果分配给某物:

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

由于Polynomial::toString() 中没有返回语句,这本身就是未定义的行为,因此很容易导致分段违规。您可以通过返回stringstreams 的`字符串:

轻松解决此问题
return result.str();

【讨论】:

    【解决方案2】:

    您的函数缺少 return 语句(可能只是 return 部分)。根据标准,在具有返回类型的 main 之外的任何函数上到达右大括号是未定义的行为,根据 C++11 标准的 §6.6.2/2,如下所示,这通常会导致崩溃,尽管它可能并不总是这样做。

    除此之外,没有什么会导致未定义的行为或崩溃。您要做的是添加return 部分:

    return result.str();
    

    对于它的价值,GCC 4.7.2 给出了以下警告:

    警告:函数中没有返回语句返回非 void [-Wreturn-type]

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


    标准参考:

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

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多