Masz błędy w sekcjach TABLICZKA MNOZENIA i CZYSZCZENIE PAMIECI.
Ja poprawiłem kod pierwszej z tych sekcji na:
for (int i = 0; i < rozmiar; i++)
{
for(int j = 0; j < rozmiar; j++)
{
tab[i][j] = (i + 1) * (j + 1);
std::cout << tab[i][j] << " ";
}
std::cout << '\n';
}
Odwołuję się do poszczególnych elementów tablicy (co prawda tablicy dynamicznej, ale można je traktować bardzo podobnie) przy pomocy []. Moim zdaniem błąd popełniasz tutaj:
*(tab++);
Zastanów się czemu. 
No i druga sprawa, przy czyszczeniu pamięci. Najpierw inkrementujesz wskaźnik tab, a następnie próbujesz zdealokować dane które zostały wcześniej zaalokowane dynamicznie. Ale po inkrementacji wskaźnika, wskazuje on już na zupełnie inny adres, więc prawdopodobnie każesz systemowi operacyjnemu zdealokować dane, które nie zostały zaalokowane, lub też takie, które nie należą do Ciebie.
Ja poprawiłem ten kod na taki:
for (int i = 0; i < rozmiar; i++)
{
delete [] tab[i];
}
delete [] tab;
Znowu, używam operatora [] do odwoływania się do poszczególnych elementów tablicy.
Tak przy okazji, to odradzam używanie gołych operatorów new i delete. Nie jest to zbyt bezpieczne narzędzie. Jeżeli potrzebujesz dynamicznej tablicy, to prawdopodobnie możesz też użyć jednego z istniejących w STL kontenterów.
Inną sprawą jest, że zamiast martwić się ręcznym zwalnianiem obszarów zaalokowanej przez siebie pamięci (o czym można łatwo zapomnieć), lepiej jest korzystać z takiego mechanizmu jak inteligentne wskaźniki. Ale jeśli się jeszcze uczysz, to przyjdzie na to czas. 