Błąd destruktora C++

Błąd destruktora C++
M0
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:4
0

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

Kopiuj
#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:

Kopiuj
#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 [].

spartanPAGE
ps, jeśli gdzieś dojdzie do skopiowania twojego Window (np będziesz chciał sobie to wrzucić do wektora) to pięknie Ci się wysypie :)
mwl4
  • Rejestracja:około 12 lat
  • Ostatnio:24 dni
  • Lokalizacja:Wrocław
  • Postów:399
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.


Asm/C/C++
M0
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:4
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ęć.

RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:dzień
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.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
M0
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:4
0

Dzięki za pomoc

M0
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:4
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 :)

RE
poczytaj sobie o nullptr.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
0

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


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.