Jawne użycie destruktora prowadzi do wyskoczenia błędu

0

Oto mój fragment kodu

//Definicja konstruktora i destruktora
MAP::MAP(ROZMIAR X, ROZMIAR Y): RX(X), RY(Y)
{
	TABLICA = new WYMIAR[RY];	//tablica jest typu DWUWYMIAR przy czym to nic innego jak int**, WYMIAR to int*
	for(int i = 0; i < RY; i++)
		TABLICA[i] = new ROZMIAR[RX];	//ROZMIAR to int
}

MAP::~MAP()
{
	cout << "\nzadzial destruktor\n";
	for(int i = 0; i < RY; i++)
		delete [] TABLICA[i];
	delete [] TABLICA;
}
//wybór opcji
		switch(_MENU.WCZYTAJ())
		{
		case 1: _MAP.~MAP();
			break;
		case 2:
			break;
		case 3:
			break;
		}

Jeżeli wybiorę każdą inną opcję, wszystko działa super, jak wybiorę 0, to destruktor się wywołuje niejawnie i też nic się nie dzieje. Z kolei jak wpiszę opcję 1, to do wyłączenia programu działa ok, natomiast kiedy program się zamyka, to wyskakuje błąd, a oto co pluje kompilator

'Kółko i krzyżyk.exe': Loaded 'C:\Users\MJay\Documents\Visual Studio 2010\Projects\Kółko i krzyżyk\Debug\Kółko i krzyżyk.exe', Symbols loaded.
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
'Kółko i krzyżyk.exe': Loaded 'C:\Windows\SysWOW64\apphelp.dll', Cannot find or open the PDB file
'Kółko i krzyżyk.exe': Loaded 'ImageAtBase0x4ac80000', Loading disabled by Include/Exclude setting.
'Kółko i krzyżyk.exe': Unloaded 'ImageAtBase0x4ac80000'
'Kółko i krzyżyk.exe': Loaded 'ImageAtBase0x4a1d0000', Loading disabled by Include/Exclude setting.
'Kółko i krzyżyk.exe': Unloaded 'ImageAtBase0x4a1d0000'
'Kółko i krzyżyk.exe': Loaded 'ImageAtBase0x4a330000', Loading disabled by Include/Exclude setting.
'Kółko i krzyżyk.exe': Unloaded 'ImageAtBase0x4a330000'
First-chance exception at 0x56fd59da (msvcr100d.dll) in Kółko i krzyżyk.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
Unhandled exception at 0x56fd59da (msvcr100d.dll) in Kółko i krzyżyk.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
The program '[4624] Kółko i krzyżyk.exe: Native' has exited with code -1073741819 (0xc0000005).

0

po co jawnie wywołujesz destruktor? Jest on wywoływany podczas usuwania obiektu przez delete. Jawne wywołanie destruktora jest mało kiedy uzasadnione (z wyjątkiem placement new)

0

Nikt nie może mi zabronić jawnego użycia destruktora, natomiast, normalnie tego destruktora nie wywołuje jawnie, on sam po zakończeniu pracy programu sprząta.
Chciałem go tam wstawić na próbę modyfikacji kodu. Ale wychodzi błąd tak jakby usunięcie obiektu powodowało błąd, a nigdzie później nie jest wykorzystywany ;o

0

Nikt Ci nie zabroni korzystać z nieswojej pamięci, nikt Ci nie zabroni zwalniać pamięci 902343 razy, nikt Ci nie zabroni przepełniania stosu. Wielu rzeczy nikt Ci nie zabroni, co nie znaczy, że to jest poprawne.

Error wyskakuje dlatego, że ten destruktor jest pewnie wywoływany dwa razy.

0

@MJay ale o co ci w ogóle chodzi? Zwalniasz pamięć 2 razy to i leci ci błąd. Czego sie spodziewałeś? Oklasków? o_O
Czy może uważasz że komputer jest wszechwiedzący i wie że sobie ręcznie wywołałeś destruktor i że pamięć została już zwolniona? Jeśli tak, to bardzo mi przykro, ale on aż tak sprytny nie jest...

0

@Shalom, czekałem na oklaski.

Myślałem, że destruktor jak już jest jawnie wywołany to nie wykona się drugi raz. To do czego służy jawne wywoływanie destruktora, bo nie widzę w takim układzie sensu jego zastosowania?

0

Może być potrzebne przy tzw. placement new (przeładowujesz operatory new i delete). Np. raz alokujesz duży obszar pamięci, a operatory new i delete nią zarządzają wrzucając tam obiekty. Przydatne jeżeli bardzo często zwalniasz i alokujesz pamięć.

0

O no właśnie i teraz mam pytanie, jeżeli zaalokuję sobie pamięć powiedzmy zrobię to raz na początku programu (stworzę sobie plac budowy ;]). A następnie będę alokował obiekty w ten sposób

typ* obiekt = new (gdzie) typ[n]

a następnie ten element usunę, to ta pamięć jest wciąż zarezerwowana tak? Żaden śmieć mi tam po skasowaniu się nie wciśnie?

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