如何修复C ++的分段错误?

时间:2018-11-20 22:57:21

标签: c++

编译我的代码时出现分段错误错误。我不知道该如何解决。我应该用教授的poly_check.o来编译Polynomial.cpp,但是会出现分段错误。

这是我的多项式。h:

#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

#include <iostream>
using namespace std;

class Polynomial {

    private:
         double *coefficients;
         int size;

    public:

         Polynomial();
         Polynomial(double c[], int size);
         Polynomial(const Polynomial &poly);

         ~Polynomial();

         void set(double c[], int size);

         inline int getDegree() const {
         return size - 1;
         }

         double f(double x)const;

         bool operator== (const Polynomial &poly)const;
         Polynomial operator+ (const Polynomial &poly)const;

         friend ostream & operator << (ostream &out, const 
         Polynomial &poly); 
         friend istream & operator >> (istream &in,  Polynomial 
         &poly); 

 };

#endif

这是我的Polynomial.cpp:

#include "Polynomial.h"
#include <iostream>
#include <cmath>

using namespace std;

Polynomial::Polynomial() {
    size = 0;
    coefficients = NULL;
}

Polynomial::Polynomial(double c[], int size) {

    this->size = size;
    coefficients = new double[size];

    for (int i = 0; i < size; i++) {
        coefficients[i] = c[i];
    }
}

Polynomial::Polynomial(const Polynomial &poly) {

    if (coefficients != NULL)
        delete coefficients;

    this->size = poly.size;
    coefficients = new double[size];

    for (int i = 0; i < size; i++)
        coefficients[i] = poly.coefficients[i];
}

Polynomial::~Polynomial() {

    if (coefficients != NULL)
        delete coefficients;
} 

void Polynomial::set(double c[], int size) {

    this->size = size;
    if (coefficients != NULL)
        delete coefficients;

    coefficients = new double[size];

    for (int i = 0; i < size; i++)
        coefficients[i] = c[i];
}

double Polynomial::f(double x)const {

    double value = 0.0;

    for (int i = 0; i < size; i++) {
        value += (coefficients[i] * pow(x, i));
    }

    return value;
}

bool Polynomial::operator== (const Polynomial &poly)const {

    if (this->size != poly.size)
        return false;

    for (int i = 0; i < size; i++) {
        if (poly.coefficients[i] != coefficients[i])
            return false;
    }

    return true;
}


Polynomial Polynomial::operator+ (const Polynomial &poly)const {

    int maxSize = size;
    if (poly.size > maxSize)
        maxSize = poly.size;

    double sum[maxSize] = {0.0};

    for (int i = 0; i < size; i++) {
        sum[i] = coefficients[i];
    }

    for (int i = 0; i < poly.size; i++) {
        sum[i] += poly.coefficients[i];
    }

    Polynomial sumP(sum, maxSize);
    return sumP;
}

ostream &operator << (ostream &out, const Polynomial &poly) {

    for (int i = poly.size - 1; i >= 0; i--) {

        if (i != poly.size - 1) {
            if (poly.coefficients[i] >= 0)
                out << " + ";
            else
                out << " - ";
        }
        out << poly.coefficients[i];
        if (i == 0)
            continue;
        if (i == 1)
            out << "x";
        else
            out << "x^" << i;   
    }

    return out;
}

istream &operator >> (istream &in,  Polynomial &poly) {

    int degree;
    in >> degree;

    double c[100];
    int size = 0;


    while (in >> c[size]) {
        size++;
        if ((size-1) == degree)
            break;
    }

    poly.set(c, size);
    return in;
}

这是我的poly_test.cpp:

#include "Polynomial.h"
#include <iostream>
using namespace std;

int main(void) {

    double c1[] = {0, 1, 2, 3, 4};
    double c2[] = {0, 1, 2, 3, 4, 5, 6};

    Polynomial p1(c1, 5);
    Polynomial p2(c2, 7);

    Polynomial p3;
    cout << "Enter p3: ";
    cin >> p3;

    cout << "p1: ";
    cout << p1 << endl;

    cout << "p2: ";
    cout << p2 << endl;

    cout << "p3: ";
    cout << p3 << endl;

    Polynomial p4;
    p4 = p1 + p2;
    cout << "p4 = p1 + p2,  p4: ";
    cout << p4 << endl;

    double value = p1.f(2);
    cout << "Evaluating p1 at x = 2, p1 = ";
    cout << value << endl;

    Polynomial p6(c1, 5);
    cout << "p6: ";
    cout << p6 << endl;
    if (p6 == p1) {
       cout << "p6 and p1 are equal. Equality test passed" << 
   endl;
    }
     else {
        cout << "Equality test failed" << endl;
    }

    return 0;
}

这是我得到的错误: segmentation fault error

1 个答案:

答案 0 :(得分:2)

通常,在开发代码时应测试自己的代码。 不要编写这么多的代码,然后将其插入测试功能;它会失败,并且调试过程会很漫长且令人沮丧。

(或其中一个)特定的问题是您忽略了实施operator=。您熟悉浅层副本和深层副本吗?默认的复制构造函数是浅层复印机,因此Polynomial的两个实例带有指向同一数组的指针。然后他们死了,他们俩都试图将其删除。