Как все запущено...
В конструкторе
int** arr = new int* [rows];
Этот arr
— локальная переменная, и к члену arr
не имеет никакого отношения.
Далее, выделена память под массив указателей, но не выделена память для самих элементов. Так что arr[i]
указывает в никуда (вообще-то в основном потому, что см. п.1), так что еще один повод для UB.
delete[]*arr;
— это вообще бред, и не только из-за пункта 1, но и потому, что это просто попытка освобождения памяти по адресу в первом элементе массива arr
и не более того. Которая, напомним, не выделена.
P.S. Ответ на вопрос "как это исправить?" — заранее: учить язык, искать на ruSO работу с двумерными массивами (огромное количество вопросов с ответами...) и т.д.
P.P.S. И — это НЕ "исключение С++". Никаким catch(...)
вы его не перехватите...