Dynamiczna alokacja pamięci w tablicy 2 wymiarowej.

0
#include "stdafx.h"
class Swiat
{
	int x, y;
	char **mapa;

public:
	Swiat(int x1, int y1);
	void AlokujMape(int x, int y);
	void WyczyscMape();
};
Swiat::Swiat(int x1 = 20, int y1 = 20) :x(x1), y(y1)
{
	AlokujMape(x1, y1);
}
void Swiat::AlokujMape(int x, int y)
{
	mapa = new char *[y];
	for (int i = 0; i<y; i++)
		mapa[i] = new char[x];
	WyczyscMape();
}
void Swiat::WyczyscMape()
{
	for (int i = 0; i < y; i++)
		for (int j = 0; j < x; j++)
			mapa[i][j] = ' ';
}


int main()
{
	Swiat *s= new Swiat(10, 12);
    return 0;
}


Czy dobrze alokuje i zwalniam pamieć?
Ten program kompiluje się poprawnie, ale w moim "prawdziwym" programie po wykonaniu kilku operacji program sie buguje i w destruktorze jest problem ze zwolnieniem pamieci.

Dokładnie jest to błąd:
"program.exe has triggered a breakpoint."

2

Kompletnie ignorujesz rule of three, więc zapewne masz gdzieś problem z kopią. Ogółem, nie używaj nagich new i delete, w C++ masz std::vector i inne kontenery. A do klasy reprezentującej macierz dużo częściej sensowne jest użycie jednowymiarowej tablicy i dwuwymiarowego widoku:

0

Chodzi o brak konstruktora kopiującego i operatora przypisania tak? Nigdzie tej klasy nie kopiuje, ani tez do niczego nie przypisuje.
Błąd wyświetla się podczas usuwania tej dwuwymiarowej tablicy. Dziwne tez jest to, że czasem wywala się w ten sposób, że alokuje np 10x15, a program wywala się dla tej funkcji

przy i=2

void Swiat::zwolnijMape()
{
	for (int i = 0; i<y; i++)
		delete[] mapa[i];
	delete[] mapa;

	mapa = nullptr;
}

Nie jest to dziwne? Przecież nawet jeśli pomyliłbym się w alokacji, to na pewno istnieje jeszcze element o takim indeksie.

A z kolei jeśli alokuje tablice 20x20 to wszystko o dziwo działa poprawnie.

0

Oczekujesz, że znajdziemy błąd w kodzie, którego nie pokazałeś? Szklana Kula w niedziele nie pracuje.

0

Zablokuj konstruktor kopiujący i operator przypisania to się przekonasz czy aby na pewno nie kopiujesz.
A tak w ogóle to przełam się i odpal debugger. Serio, pomaga ;).

0
Swiat(const Swiat& other) // copy constructor
	{
		system("PAUSE");
	}
	Swiat&operator=(const Swiat& other) 
	{
		system("PAUSE");
	}

W ten sposob sprawdziłem, i rzeczywiście nic nie kopiuje.
Kod jest bardzo długi i staram się opisać problem najbardziej obrazowo jak tylko mogę.
Czy jest możliwym, że źle coś usuwam w innych miejscach a dopiero tutaj wyskakują błędy?

0

Wstaw cały kod który się wywala, albo nikt Ci nie pomoże

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