简体   繁体   English

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

[英]How to fix segmentation fault for C++?

I am getting a segmentation fault error when compiling my code. 编译代码时出现分段错误错误。 I don't know how to fix it. 我不知道该如何解决。 I am supposed to compile my Polynomial.cpp with my professor's poly_check.o, but I get a segmentation fault error. 我应该用教授的poly_check.o来编译Polynomial.cpp,但是会出现分段错误。

This is my Polynomial.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

This is my Polynomial.cpp: 这是我的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;
}

This is my poly_test.cpp: 这是我的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;
}

This is the error that I am getting: segmentation fault error 这是我得到的错误: 细分错误

In general, you should test your own code as you develop it. 通常,在开发代码时应测试自己的代码。 Don't write this much code and then plug it into a test function; 不要写那么多的代码,然后将其插入测试功能; it will fail, and the process of debugging it will be long and discouraging. 它将会失败,并且调试过程将很漫长且令人沮丧。

The specific problem (or one of them) is that you neglected to implement operator= . 特定的问题(或其中之一)是您忽略了实现operator= Are you familiar with shallow copies and deep copies? 您熟悉浅层副本和深层副本吗? The default copy constructor is a shallow copier, so that two instances of Polynomial wind up with pointers to the same array. 默认的复制构造函数是浅层复印机,因此, Polynomial两个实例将带有指向同一数组的指针。 Then when they die, they both try to delete it. 然后他们死了,他们都试图删除它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM