C ++ malloc ошибка - PullRequest
       1

C ++ malloc ошибка

1 голос
/ 09 мая 2011

Я программист на Java, но теперь мне нужно написать немного кода на c ++.Я изучил основы C ++ пару лет назад, так что я не очень подходит.

Я написал небольшой класс, который описывает полином.Вот оно:

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

using namespace std;

Polynom::Polynom()
{
    this->degree = 0;
    this->coeff = new int[0];
}

Polynom::Polynom(int degree)
{
    this->degree = degree;
    this->coeff = new int[degree + 1];
}

Polynom::~Polynom()
{
    delete coeff;
}

void Polynom::setDegree(int degree)
{
    this->degree = degree;
}

void Polynom::setCoeffs(int* coeff)
{
    this->coeff = &*coeff;
}

void Polynom::print()
{
    int i;
    for(i = degree; i >= 0; i --)
    {
        cout<<this->coeff[i];
        if(i != 0)
            cout<<"x^"<<i;
        if(i > 0)
        {
            if(coeff[i - 1] < 0)
                cout<<" - ";
            else
                cout<<" + ";
        }
    }    
}

Хорошо, теперь я попытался прочитать степень и коэффициенты полинома и распечатать его в консоли.Вот код для этого:

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

int main()
{
    int degree;

    cout<<"degree = ";
    cin>>degree;
    int* coeff = new int[degree];
    int i;
    for(i = 0; i <= degree; i++)
    {
        cout<<"coeff[x^"<<i<<"] = ";
        cin>>coeff[i];
    }
    Polynom *poly = new Polynom(degree);
    //poly->setDegree(degree);
    poly->setCoeffs(coeff);
    cout<<"The input polynome is: ";
    poly->print();
    return 0;
}

При компиляции кода все в порядке.При запуске, если я даю четный градус, а затем задаю некоторые коэффициенты, программа работает нормально. Но : если я определяю нечетную степень (например, 3 или 5) и затем даю коэффициенты, программа не печатает полином и возвращает следующую ошибку:

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

Почему это происходит?Где я не выделил достаточно памяти для массива?Я погуглил эту ошибку и наткнулся на эту страницу , но упомянутое там решение мне не сильно помогло.

Может быть, вы можете увидеть другую проблему в моем коде?Буду очень признателен за вашу помощь.

Заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 09 мая 2011

В вашем коде много ошибок.C ++ не похож на Java, и кажется, что вы используете указатели, как будто они похожи на ссылки в Java, а они категорически не являются.

Polynom::Polynom()
{
    this->degree = 0;
    this->coeff = new int[0];
}

Это создает массив нулевого размера, что допустимо в C ++, но почти никогда не то, что вы хотите.

Polynom::~Polynom()
{
    delete coeff;
}

Массивы в C ++ должны быть удалены с помощью delete []:

Polynom::~Polynom()
{
    delete [] coeff;
}

Это:

void Polynom::setDegree(int degree)
{
    this->degree = degree;
}

делает несмысл - вы меняете степень, но не массив, с которым он связан.

void Polynom::setCoeffs(int* coeff)
{
    this->coeff = &*coeff;
}

Я понятия не имею, что вы думаете об этом, и я подозреваю, что вы тоже этого не делаете.И у вас есть утечка памяти.

Это было только для начала - Isuspect, есть гораздо больше плохих вещей.Вам нужно сделать две вещи:

  • Читать книгу на C ++.Поскольку у вас есть опыт программирования, я рекомендую Ускоренный C ++ .

  • Забудьте о своих знаниях Java.Как я уже сказал, эти два языка почти не имеют ничего общего.

4 голосов
/ 09 мая 2011
int* coeff = new int[degree];
int i;
for(i = 0; i <= degree; i++)

Вы выделяете пространство для degree элементов и помещаете туда degree+1 элементы ... Поведение не определено.

1 голос
/ 09 мая 2011

Оператор i <= degree в цикле for вызывает его.Поскольку индексы массива начинаются с 0, допустимый диапазон составляет 0->degree-1.Поскольку вы пишете в недопустимую область памяти, ваша программа ведет себя непредсказуемо.

1 голос
/ 09 мая 2011

В вашей функции main(), int *coeff = new int[degree] дает вам массив длины degree, с индексами элементов в диапазоне от 0 до degree-1 включительно.В вашем цикле вы получаете доступ к элементам от 0 до degree включительно.Это неопределенное поведение , которое может вызывать или не вызывать ошибки времени выполнения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...