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