Problem z dealokacją pamięci

0

Wywala mi błąd podczas działania programu, jak nie kasuję wskaźników to jest ok.

#include <iostream>

using namespace std;

int main()
{
    int sz = 5;
	int* tab = new int[sz];

	for(int i = 0; i<sz; i++)
		tab[i] = i;

	int* tab1 = new int[sz+1];
	tab1 = tab;
	tab1[sz] = 111;
	sz++;

	tab = tab1;
	
	for(int i = 0; i<sz; i++)
		cout << tab[i] << endl;

	delete [] tab1;
	delete [] tab;

	return 0;
}
  • poprawione formatowanie kodu*
0

Bo kasujesz tą samą tablicę 2 razy. Alokujesz RAZ tablicę, potem tylko kopiujesz jej adres do innej zmiennej. Adres, nie całą tablicę.

Musisz bardziej zrozumieć ideę wskaźników

0

Ale jak napiszę tylko delete tab tylko raz też wywala mi błąd.

0

Ok, dzięki już zrozumiałem :)

0
         int* tab1 = new int[sz+1];
         tab1 = tab;

Przypisując nową wartość do wskaźnika w drugiej linijce bezpowrotnie tracisz dostęp do zaalokowanej pamięci w pierwszej linijce.
Rozpiszę ci to na 3 linijki, żeby było widać wyraźniej dlaczego:

int* tab1;
tab1 = new int[sz+1];
tab1 = tab;

Tak zaalokowanej i zgubionej pamięci nie zwolnisz żadnym delete.

1

No właśnie, patrz komentarze.

int* tab = new int[sz]; // tworzysz wskaźnik na int, przypisujesz do niego wskaźnik na obszar w pamięci, który zarezerwował new[]
int* tab1 = new int[sz+1]; // tworzysz wskaźnik na int, przypisujesz do niego wskaźnik na obszar w pamięci, który zarezerwował new[]
tab1 = tab; //do tab1 (wskaźnik na drugi obszar, czyli adres) przypisujesz adres pierwszego obszaru. Właśnie straciłeś adres na drugi wskaźnik.

W efekcie zarezerwowałeś dwa obszary w pamięci, masz dwa wskaźniki, lecz oba pokazują na ten sam obszar. Na drugi obszar już nie masz wskaźnika, więc nie mozesz z nim nic zrobic, tym bardziej go zwolnić. Ponadto, pracując na tab1, myślać że to obszar o wielkości (sz+1)sizeof(int), pracujesz na obszarze o wielkości szsizeof(int), więc masz duże szanse naruszyć nieswój obszar pamięci.

0

Dzięki wielkie :))

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