Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu. this 0xCCCCCCCC.

0

Piszę obiektowo symulację gry RPG. Napotkałem na bardzo dziwny problem, mianowicie, gdy staram się porównać wartości zwracane przez akceosory z klasy mob w klasie arena występuje mi wyżej wymieniony błąd w Visual Studio. Ma ktoś może pomysł na to? Na razie jestem na etapie sprawdzanie czy działa mi odnajdywanie współrzędnych mobow na arenie zrobionej z tablicy dwuwymiarowej. Używam akcesorów nie od dzisiaj i pierwszy raz się z czymś takim spotykam. Prosze o pomoc jak rozwiązać ten problem z wyjątkiem. Dodam jeszcze że zawsze się kompiluje, nie wyrzuca błędów, ale po uruchomieniu programu wlącza sie ten wyjątek. Dzięki!

arena.h :

#pragma once
#include <string>
#include <iostream>
#include "Mob.h"
class arena
{
    string arenaa[10][10];
    Mob*a[10]; 
    int ilosc_mobow; 
    int poziom_mobow; 
    int iteracja_mobow; 
public:
    arena();
    ~arena();
    void inicjalizuj_arene();
    void up_ilosc_mobow(); 
    void up_poziom_mobow(); 
    void daj_mob_wspo(); 
    void pokaz_wspol(); 
    void set_arena(); 
    void show_arena();
};
#include "arena.h"
#include "Mob.h"
#include <string>
#include <iostream>
using namespace std; 
arena::arena()
{
    iteracja_mobow = 0; 
    up_ilosc_mobow(); 
    up_poziom_mobow();
    for (int i = 0; i < ilosc_mobow; i++)
    {
        a[i] = new Mob(poziom_mobow); 
    }
}

arena::~arena()
{
    for (int i = 0; i < ilosc_mobow; i++)
    {
        a[i] = NULL; 
        delete a[i]; 
    }
}
void arena::inicjalizuj_arene() 
{
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            arenaa[i][j] = "  ";  
        }
    }

}
void arena::daj_mob_wspo()
{
    int j = 0; 
    int l = 0; 
    int h = 0; 
    for(int i = 0 ; i < ilosc_mobow; i++)
    {
        if (i < 3)
        {
            a[i]->up_wspolx(j);
                j = j + 4;
            a[i]->up_wspoly(l); 
        }
        else if (i > 2 && i < 6)
        {
            j = 9;
            a[i]->up_wspoly(l);
            l = l + 4; 
            if (l == 12) l = 9;
            a[i]->up_wspolx(j);
        }
        else if (i > 5 && i < 9)
        {
            l = 9; 
            j = j - 4; 
            h = j + 3; 
            a[i]->up_wspolx(h); 
            a[i]->up_wspoly(l); 
        }
        else if(i>8 && i <13)
        {
            j =0 ; 
            l = l - 2; 
            if (l == 0)l = 2; 
            a[i]->up_wspolx(j); 
            a[i]->up_wspoly(l); 
        }
    }
}
void arena::up_ilosc_mobow()
{
    cout << "Podaj ilosc mobow, tylko parzyste. 1-10" << endl; 
    int r = 11; 
    while (r > 10|| r%2==1)
    {
        cin >> r;
    }
    ilosc_mobow = r; 

}
void arena::up_poziom_mobow()
{
    cout << "Podaj poziom mobow, maksymalnie 3!" << endl; 
    do
    {
        cin >> poziom_mobow; 

    } while (poziom_mobow > 3); 

}
void arena::pokaz_wspol()
{
    for (int i = 0; i < ilosc_mobow; i++)
    {
        cout << a[i]->a_wspol_x()<<"    "<<a[i]->a_wspol_y() << endl; 
    }
}
void arena::set_arena()
{
    int tmp_ilosc_mobow; 
    for(tmp_ilosc_mobow=0; tmp_ilosc_mobow<=ilosc_mobow; tmp_ilosc_mobow++)

        for (int i = 0; i < ilosc_mobow; i++)
        {
            cout << "|"; 

            for (int j = 0; j < ilosc_mobow; j++)
            {
                if (i == a[tmp_ilosc_mobow]->a_wspol_y() && j == a[tmp_ilosc_mobow]->a_wspol_x())
                    cout << i << "SASASAS" << j << endl;
            }
            cout << "|" << endl; 
        }

}

void arena::show_arena()
    {
    for (int i = 0; i < 10; i++)
    {
        cout << "|";
        for (int j = 0; j < 10; j++)
        {
            cout << arenaa[i][j]; 
        }
        cout << "|" << endl;
    }
}

Problem jest w metodzie set_arena()
natomiast tu jest klasa mob.h

#pragma once
#include <iostream>
#include <string>
using namespace std;
class Mob
{
    int dmg; 
    int hp; 
    string name; 
    int exp; 
    int lvl; 
    int wspol_x; 
    int wspol_y; 

public:
    Mob(int lvll);
    ~Mob();
    string a_name();
    int a_lvl();
    int a_exp();
    int a_hpmax();
    int a_dmg();
    void image(); 
    void up_wspolx(int a); 
    void up_wspoly(int a); 
    int a_wspol_x(); 
    int a_wspol_y(); 

};
#include "Mob.h"

Mob::Mob(int lvll)
{
    lvl = lvll; 
    if (lvl == 1)
    {
        dmg = 5;
        hp = 5;
        name = "Wilk";
        exp = 10;
    }
    else if (lvl == 2)
    {
        dmg = 10;
        hp = 20;
        name = "Ork";
        exp = 30;
    }
    else if (lvl == 3)
    {
        dmg = 30;
        hp = 50;
        name = "Smok";
        exp = 50;

    }
}

Mob::~Mob()
{
}
int Mob::a_hpmax()
{
    return hp; 
}
string Mob::a_name()
{
    return name; 
}

int Mob::a_exp()
{
    return exp; 
}
int Mob::a_dmg()
{
    return dmg; 
}
int Mob::a_lvl()
{
    return lvl; 
}
void Mob::image()
{
    if (lvl == 1)
        cout << "+";
    else if (lvl == 2)
        cout << "#";
    else if (lvl == 3)
        cout << "@"; 
}
void Mob::up_wspolx(int a)
{
    if (a < 21)
        wspol_x = a;
    else
        cout << "nie miesci sie na plaszny" << endl; 
}
void Mob::up_wspoly(int a)
{
    if (a < 21)
        wspol_y = a;
    else
        cout << "nie miesci sie na plaszny" << endl;
}
int Mob::a_wspol_x()
{
    return wspol_x; 
}
int Mob::a_wspol_y()
{
    return wspol_y; 
}

Problem zaczyna się w akcesorach dotyczących wspolrzednych mobow na arenie :

int Mob::a_wspol_x()
{
    return wspol_x; 
}
int Mob::a_wspol_y()
{
    return wspol_y; 
}
1

Przede wszystkim to radzę sprawdzać co oznaczają takie magiczne maski pamięci. Maską 0xCC oznacza się niezainicjowane zmienne na stosie, o ile masz włączoną opcję /GZ https://msdn.microsoft.com/en-us/library/aa699247(v=vs.60).aspx W twoim przypadku jest to obiekt Mob.

Przechodząc do samego problemu to tylko w konstruktorze arena alokujesz zadane ilosc_mobow, później już tylko podbijasz ten licznik. Zatem najprawdopodobniej próbujesz się dostać do nieistniejącego moba. Drugi błąd, który widzę to memory leak w destruktorze arena, najpierw przypisujesz NULL do wskaźnika, a później próbujesz go zwolnić. Odwróć kolejność.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0