Помощь с ошибкой выделения памяти в c++, linux с использованием g++

Я искал других с похожей проблемой на мою, но все они имеют совсем другой код, чем мой.

Когда я компилирую следующий код с помощью g++, я получаю сообщение об ошибке:

BasketbOOP: malloc.c:2451: sYSMALLOc: Утверждение `(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)' не удалось. Прервано (сброшено ядро)

Я никогда не использую free() или подобные функции, поэтому не думаю, что это проблема.

Когда я запускаю свой код через valgrind, я получаю «Неверная запись размера 4». а затем какая-то тарабарщина, которую я не совсем понимаю, указывает мне на конструктор Player.

Для тех, кому интересно, это программа моделирования баскетбольного мяча, которую я пишу для задания, чтобы помочь изучить и понять ООП, поэтому, очевидно, я НЕ прошу вас написать мой код для меня, это просто ошибка, с которой я никогда раньше не сталкивался. и Нужно исправить это, чтобы продолжить задание.

ps: извините за отсутствие комментариев, я еще не дошел до этого :/ pps: форматирование может выглядеть странно из-за того, что мне пришлось сделать отступ в коде, чтобы он отображался как код

Спасибо всем, кто поможет заранее!

#include <iostream>
#include <time.h>
#include <string>
#include "/home/craig/Programming/GeneralFunction (1).h"
using namespace std;


class player {
private:
    int percent[3];
    string name;
    int shots[3];
    int made[3];
    bool MVP;

public:
    player(int i){
        for (int n = 0; n < 3; n++){    
            shots[i] = 0;
            made[i] = 0;
        }
        MVP = false;
        cout << "What is player #" << i << "'s name? ";
        if (i != 1){
            cin.clear();    
            cin.ignore();
        }
        getline(cin, name);
        for (int n = 0; n < 3; n++){
            cout << "What is " << name << "'s " << n+1 << "pt Shot Percentage? ";
            cin >> percent[n];
            if (percent[n] < 0){
                cout << "Because you entered a Percent lower than 0%, the percent has been set to 0%. \n";  
                percent[n] = 0;
            }
            if (percent[n] > 100){
                cout << "Because you entered a Percent greater than 100%, the percent has been set to 100%. \n";    
                percent[n] = 100;
            }
        }//for
    }//player constructor

    ~player(){
        cout << "Deleting " << name << endl;
    }

    void RandomPlay(int point){

        switch(point){
case 0:
    switch(rand()%2){
case 0:
    cout << name << " is fouled. " << name << " takes the foul shot and... ";
    break;
case 1: 
    cout << name << " takes a free throw and...";
    break;
    }//switch 2
    break;//1 point

case 1:
    switch(rand()%4){
case 0:
    cout << name << " goes Up for a lay-up and...";
    break;
case 1:
    cout << name << " jumps for a SlamDunk and..."; 
    break;
case 2:
    cout << name << " shoots a jump shot and...";
    break;
case 3:
    cout << name << " attempts a field goal from inside the three point line and...";
    break;
    }//switch 4
    break;//2 point

case 2:
    switch(rand()%2){
case 0:
    cout << name << " shoots a three pointer and...";
    break;
case 1:
    cout << name << " attempts a field goal from outside the three point line and...";
    break;                  
    }
    break;//three point
        }//switch point
    }//RandomPlay


    int TakeShot(){
        int point = rand()%3;
        RandomPlay(point);
        shots[point]++;
        if (rand()%100+1 <= percent[point]){
            made[point]++;
            return (point+1);   
        }
        return 0;
    }

    void DispPlayerStats(){
        cout << "PLayer: " << name << endl;
        for (int i = 0; i < 3; i++){
            cout << i+1 <<" point shot Percent: " << percent[i] << "%" << endl;
            cout << i+1 << "pt Shots Taken: " << shots[i] << endl;
            cout << i+1 <<"pt Shot Baskets Made: " << made[i] << endl;
        }
        if (MVP)
            cout << name << " was the Most Valuable Player on the Team!" << endl;
    }

};

class team {
private:
    player *ptrPlayer[5];
    string teamName;
    static int score;

public:
    team(int i){
        cout << "What is this teams name? ";
        if (i != 1){
            cin.clear();    
            cin.ignore(10000, '\n');
        }
        getline(cin, teamName);
        cout << "Enter Player info for Team " << teamName << ":" << endl;
        for (int i = 0; i < 5; i++){
            ptrPlayer[i] = new player(i+1);
        }
    }

    string GetName(){

        return teamName;
    }



    int Play(int score){
        int oldScore = score;   
        score += ptrPlayer[rand()%5]->TakeShot();
        if (oldScore == score)
            cout << " misses!" << endl;
        else
            cout << " makes it! " << score - oldScore << " more points for Team " << teamName << "!" << endl;

        return score;
    }

};

int main(){
    int score[2] = {0, 0};
    SeedRand();
    char PbP;
    char enter = 1;
    team *ptrTeam[2];
    for (int i = 0; i < 2; i++){
        cout << "ENTER INFO FOR TEAM " << i+1 << ":" << endl;   
        ptrTeam[i] = new team(i+1);
    }
    //CLS; 
    cout << "Would you like a Play by Play? [y/n] ";
    cin >> PbP;
    while (PbP != 'y' && PbP != 'Y' && PbP != 'N' && PbP != 'n'){
        cout << "Invalid Choice: Would you like a Play by Play? [y/n] ";
        cin >> PbP;
    } 
    cout << "TIME TO PLAY BASKET BALL! " << endl;
    cout << "The " << ptrTeam[0]->GetName() << " versus The " << ptrTeam[1]->GetName() << "!" << endl;


    for (int quarter = 1; quarter < 5; quarter++){
        //CLS;

        cout << score[0] << " - " << score[1] << endl;      
        for (int pos = 0; pos < 30; pos++){
            score[pos%2] = ptrTeam[pos%2]->Play(score[pos%2]);
            if (PbP == 'y' || PbP == 'Y')
                do {
                    cout << "Press x to continue." << endl;
                    cin >> enter;
                }while(enter != 'x' || enter != 'X');
        }

    }//for quarter


    return 0;
}

person Craig    schedule 30.12.2014    source источник
comment
Пожалуйста, разберитесь с отступами — это поможет сделать код читабельным.   -  person Ed Heal    schedule 31.12.2014
comment
Я сделал это (ну VS2008) сделал это для вас   -  person Ed Heal    schedule 31.12.2014
comment
Я могу сказать только одно: это ошибка getline(cin, name); Я не вижу ошибки, но getline() будет использовать malloc для выделения места, я не понимаю, как это могло быть где-то еще. Но, вероятно, то, как вы используете getline, по какой-то причине не работает.   -  person tom    schedule 31.12.2014


Ответы (2)


Взгляните еще раз на это:

for (int n = 0; n < 3; n++){    
    shots[i] = 0;
    made[i] = 0;
}
person Kenny Ostrom    schedule 30.12.2014
comment
СПАСИБО, Кенни Остром, всегда такая глупость. Я думал, может быть, я, наконец, наткнулся на большую ошибку или что-то в этом роде. Спасибо! - person Craig; 31.12.2014
comment
Реальным решением было бы использование контейнера, чтобы вы не могли случайно использовать на нем какой-либо другой итератор. std::array‹int,3› выстрелы; for (auto &x:shots) x=0; - person Kenny Ostrom; 31.12.2014
comment
Привет, Кенни, я все еще новичок в программировании. Всего около 7 месяцев. Что такое контейнеры в С++? - person Craig; 01.01.2015
comment
Контейнер — это что-то вроде массива, который содержит объекты другого типа. Использование std::vector или std::array позволяет вам писать код, который просто делает то, что вы хотите, и позволяет компилятору удостовериться, что все правильно, и очистить за вас. Использование int shots[3] - это старый массив C, что означает, что вы должны отслеживать все, и небольшая опечатка вызывает ошибку, которую вы не можете обнаружить, кроме того, что вы знаете, что что-то не так, потому что что-то в памяти было повреждено, вызывая кто знает что еще произойти (это длинный способ сказать UB или неопределенное поведение). - person Kenny Ostrom; 01.01.2015

Я не очень хорошо разбираюсь в C++, поэтому не смогу полностью вам помочь, но я уже видел почти такое же сообщение об ошибке. Это произошло из-за перезаписи памяти за пределами моего выделенного блока, скорее всего, данных, которые malloc использует внутри. Это ошибка "индекс массива выходит за пределы".

Поскольку я не могу скомпилировать ваш код без /home/craig/Programming/GeneralFunction (1).h, я не вижу сообщения valgrind. Было бы полезно, если бы вы либо разместили вывод valgrind, либо достаточно кода, чтобы его скомпилировать.

person Functino    schedule 30.12.2014
comment
Вы можете просто импортировать cstdlib для случайной функции и использовать srand(time(NULL)) вместо SeedRand, и он скомпилирован для меня. Это определенно не ошибка в GeneralFunction (1).h - person tom; 31.12.2014