Błąd destruktora C++

0

Witam,
Napisałem sobie prosty program pracujący na dynamicznie zaalokowanej tablicy. Niestety, przy bezpośrednim wywołaniu destruktora, program się wysypuje.

#include<iostream>
#include<math.h>

using namespace std;

class Window
{
public:
	Window(int a, int b);
	~Window();
	char *tab;
	void pisz(int a, int b, char c);
		void display(void);

private:
	int x, y;
};

Window::Window(int a, int b)
{
	x = a;
	y = b;
	tab = new char[x*y];
	for (int i = 0; i < x*y; i++) {
		tab[i] = ' ';
	}

}

Window::~Window()
{
	delete[] tab;
}

void Window::pisz(int a, int b, char c) {

		tab[a + (b*x)] = c;


}

void Window::display() {

	for (int i = 0; i < x*y; i++) {
		cout << tab[i];
		if ((i%x)+1 == x) {
			cout << endl;
		}
	}

}


int main() {
	Window pole(70, 23);
	
	for (int i = 0; i < 23; i++) {
		pole.pisz(0, i, '|');
	}
		
	for (int i = 1; i < 70; i++) {
		pole.pisz(i, 10, '-');
	}

	for (float i = 0; i < 12; i+=0.25) {
		int ix = 5 * i;
		int iy = sin(i)*10+10;
		pole.pisz(ix, iy, '*');
	}

	pole.display();
//	pole.~Window();			<----------- Linijka kodu, przez którą wysypuje się kod

	system("pause");
}

Natomiast jeżeli w innym pliku zrobię tak:

#include <iostream>   


int main() {

	char *tab;

	tab = new char[10];

	delete [] tab;


	return 0;
}

Wtedy nie ma żadnego problemu.
Bardzo proszę o pomoc.

PS: Prosił bym jeszcze, żeby ktoś mi wytłumaczył różnicę pomiędzy delete a delete [].

1

Po co chcesz wywoływać konstruktor sam kiedy on zostaje wywołany przy końcu scopea? Destruktor jest teraz wywoływany dwa razy, i dwa razy wywołujesz przez to operator delete na tab.

0
mwl4 napisał(a):

Po co chcesz wywoływać konstruktor sam kiedy on zostaje wywołany przy końcu scopea? Destruktor jest teraz wywoływany dwa razy, i dwa razy wywołujesz przez to operator delete na tab.

A co jeżeli potrzebowałbym stworzyć inna tablice dynamiczna i w tym celu musiał bym zwolnić pamięć z tej 1?? Wtedy trzeba to zrobić jakoś inaczej??
Dopiero się uczę, dlatego chciałbym wiedzieć kiedy w takim razie zwalniać pamięć.

1

Wychodzisz ze scopa(zakresu), obiekt jest niszczony czyli wywołujesz destruktor i zwalniasz pamięć. Jak sobie budujesz nowy obiekt to alokujesz nową tablicę jednocześnie. A po drugie poczytaj o std::vector.

0

Dzięki za pomoc

0

Właśnie doczytałem jeszcze jedną ciekawą rzecz. Jeżeli po jawnym wywołaniu destruktora do wskaźnika który pokazywał na tablicę dynamiczną (już usuniętą) podstawimy NULL to kolejne wywołanie funkcji delete nie spowoduje wysypania programu. To jeżeli ktoś by jeszcze miał z tym problem :)

0

Po prostu użyj std::vector zamiast komplikować sobie życie.

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