Problem leży w linii nr 31 i tym, co zostało zrobione w linii nr 29. Gdy wykonujemy operację przypisania na wskaźnikach, to tak naprawdę do wskaźnika po prawej stronie operatora zostaje przypisany adres, na który wskazuje wskaźnik po prawej stronie. I nie ma w tym nic złego, jeśli tuż przed przypisaniem alokujesz pamięć na nowo. Tyle tylko, że tego nie zrobiłeś, bo po zwolnieniu pamięci robisz od razu przypisanie i dopiero potem alokujesz pamięć na nowo. Więc do wskaźnika 'wskaznik' masz przypisany adres pamięci, która została już zwolniona, a do wskaźnika 'tablica' masz przypisany nowy adres pamięci.
Poniżej zamieszczam kod, który pokazuje, jak to mniej więcej działa:
int main()
{
int* p1 = new int{ 5 };
int* p2 = new int{ 6 };
std::cout << "*p1: " << *p1 << '\n';
std::cout << "&p1: " << &p1 << '\n';
std::cout << "&*p1: " << &*p1 << '\n';
std::cout << '\n';
std::cout << "*p2: " << *p2 << '\n';
std::cout << "&p2: " << &p2 << '\n';
std::cout << "&*p2: " << &*p2 << '\n';
std::cout << '\n';
p1 = p2;
std::cout << "After assignment: " << '\n';
std::cout << "*p1: " << *p1 << '\n';
std::cout << "&p1: " << &p1 << '\n';
std::cout << "&*p1: " << &*p1 << '\n';
std::cout << "*p2: " << *p2 << '\n';
std::cout << "&p2: " << &p2 << '\n';
std::cout << "&*p2: " << &*p2 << '\n';
std::cout << '\n';
delete p2;
p2 = new int{ 3 };
std::cout << "After new on p2 : " << '\n';
std::cout << "*p1: " << *p1 << '\n';
std::cout << "&p1: " << &p1 << '\n';
std::cout << "&*p1: " << &*p1 << '\n';
std::cout << "*p2: " << *p2 << '\n';
std::cout << "&p2: " << &p2 << '\n';
std::cout << "&*p2: " << &*p2 << '\n';
return 0;
}
Ten twór typu '&*p1' oznacza pokazanie adresu wyłuskanej wartości ze wskaźnika p1. Innymi słowy adres, na który wskazuje wskaźnik :)
A jeśli chodzi o rozwiązanie problemu: wystarczy przesunąć alokację pamięci przed przypisanie, to jest zamienić linie nr 31 i 32 miejscami.
PS: Generalnie fakt, że raz Ci zadziałało, a za innym razem nie, wynika z tego, że kompilator, którego używasz pozwala na coś takiego i nie krzyczy, że coś tu jest nie w porządku.