Повреждение кучи при возврате в Main - PullRequest
0 голосов
/ 05 апреля 2019

Я создаю класс динамического массива, который содержит многочлены. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я запускаю свой код, когда он выполняет оператор return в main, он начинает вызывать деструктор и начинает освобождать память из каждого экземпляра, начиная с C. Он удаляет C нормально, но когда он получает BI получить ошибку повреждения кучи. Я пытался пройтись по коду, но не вижу, где происходит коррупция. Может кто-нибудь мне помочь? Точная ошибка, которую он мне выдает: «CRT обнаружил, что приложение записало в память после завершения буфера кучи».

* Редактировать: Я более чем счастлив получить рекомендации людей, которые помогут улучшить мой код, но помните, что это для класса и имеет определенные правила. Я не могу использовать что-либо из STL. Я люблю любую критику, которую вы можете дать мне.
/////////////////////////// Заголовок ////////////////////// ///////

class Poly

{

friend std::ostream& operator<<(std::ostream& output, const Poly& pNomial);

public:
    Poly();
    Poly(const int& coeff, const int& degree = 0);
    Poly(const Poly& copy);
    ~Poly();


    void setCoeff(const int& coeff, const int& degree);     
    bool isEmpty()const;

    Poly& operator=(const Poly& pNomial);

private:
    int* coeffs;
    int highestDegree;


};

/////////////////////////// CPP /////////////////// /////

#include "poly.h"

Poly::Poly()
{
   highestDegree = 0;
   coeffs = new int[highestDegree+1]();

}

Poly::Poly(const int & coeff, const int & degree)
{
   if (degree >= 0)
   {
      highestDegree = degree;
      coeffs = new int[highestDegree + 1]();
      coeffs[degree] = coeff;
   }
   else
   {
      highestDegree = 0;
      coeffs = new int[highestDegree + 1]();

   }


}

Poly::Poly(const Poly& copy)
{
    highestDegree = copy.highestDegree;
    coeffs = new int[highestDegree + 1]();

    for (int i = 0; i < copy.highestDegree + 1; i++)
    {
        coeffs[i] = copy.coeffs[i];
    }
}

Poly::~Poly()
{
    delete[] coeffs;
}

void Poly::setCoeff(const int& coeff, const int& degree)
{
    if (degree > this->highestDegree)
    {
        Poly temp = *this;
        delete[] this->coeffs;
        this->highestDegree = degree;
        this->coeffs = new int[highestDegree]();



        for (int i = 0; i < temp.highestDegree + 1; i++)
        {
            this->coeffs[i] = temp.coeffs[i];
        }       

    }

    if (degree >= 0)
    {
        this->coeffs[degree] = coeff;
    }

}

bool Poly::isEmpty()const
{
    bool check = true;

    for (int i = 0; i < highestDegree + 1 && check; i++)
    {
        if (coeffs[i] != 0)
        {
            check = false;
        }
    }

    return check;
}

Poly & Poly::operator=(const Poly& pNomial)
{
    if (this != &pNomial)
    {
        delete[] this->coeffs;
        this->highestDegree = pNomial.highestDegree;
        this->coeffs = new int[this->highestDegree + 1]();

        for (int i = 0; i < pNomial.highestDegree + 1; i++)
        {
            this->coeffs[i] = pNomial.coeffs[i];
        }
    }

    return *this;
}

std::ostream& operator<<(std::ostream& output, const Poly& poly)
{
    if (!poly.isEmpty())
    {
        for (int i = poly.highestDegree; i >= 0; i--)
        {
            if (i == 1 && poly.coeffs[i] != 0)
            {
                if (poly.coeffs[i] >= 1)
                {
                    output << " +" << poly.coeffs[i] << "x";
                }
                else
                {
                    output << " " << poly.coeffs[i] << "x";
                }
            }
            else if (i == 0 && poly.coeffs[i] != 0)
            {
                if (poly.coeffs[i] >= 1)
                {
                    output << " +" << poly.coeffs[i];
                }
                else
                {
                    output << " " << poly.coeffs[i];
                }
            }
            else if (poly.coeffs[i] != 0)
            {
                if (poly.coeffs[i] >= 1)
                {
                    output << " +" << poly.coeffs[i] << "x^" << i;
                }
                else
                {
                    output << " " << poly.coeffs[i] << "x^" << i;
                }

            }
        }
    }
    else
    {
        output << " 0";
    }



    return output;

}``

///////////////////////////////// Главная ///////////// ////////////

#include "poly.h"
#include <iostream>

int main()
{
    Poly A, B(5, 7), C(2);
    B.setCoeff(2, 10);
    B.setCoeff(1, 3);
    B.setCoeff(5, 4);


    std::cout << A << std::endl;
    std::cout << B << std::endl;
    std::cout << C << std::endl;





    return 0;
}

1 Ответ

0 голосов
/ 05 апреля 2019

Я должен сказать, что я согласен с комментариями, и вы должны серьезно изучить правильное управление ресурсами ресурсов, которые вы используете в классе Poly. Чтобы ответить на проблему, с которой вы сейчас столкнулись, взгляните на функцию setCoeff().

this->coeffs = new int[highestDegree]();

следует изменить на

this->coeffs = new int[highestDegree + 1]();

В текущей реализации вы выделяете массив с помощью highestDegree, а в цикле for вы получаете доступ к temp.coeffs[highestDegree], что выходит за пределы доступа, то есть выполняется цикл до i < temp.highestDegree + 1.

...