Вызвано исключение С++
#include<iostream>
#include<string>
#include<ctime>
class Arr{
public:
int** arr;
int cols = 5;
int rows = 2;
public:
Arr()
{
int** arr = new int* [rows];
}
void fill_arr()
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < rows; j++)
{
arr[i][j] = rand() % 100;
}
}
}
void show_arr()
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < rows; j++)
{
std::cout << arr[i][j] << std::endl;
}
}
}
void sort_arr()
{
}
~Arr()
{
std::cout << "Вызван деструктор!";
delete[]*arr;
}
};
int main()
{
srand(time(NULL));
setlocale(LC_ALL, "Russian");
Arr arr;
arr.fill_arr();
arr.show_arr();
return 0;
}
Ответы (1 шт):
Как все запущено...
В конструкторе
int** arr = new int* [rows];Этот
arr— локальная переменная, и к членуarrне имеет никакого отношения.Далее, выделена память под массив указателей, но не выделена память для самих элементов. Так что
arr[i]указывает в никуда (вообще-то в основном потому, что см. п.1), так что еще один повод для UB.delete[]*arr;— это вообще бред, и не только из-за пункта 1, но и потому, что это просто попытка освобождения памяти по адресу в первом элементе массиваarrи не более того. Которая, напомним, не выделена.
P.S. Ответ на вопрос "как это исправить?" — заранее: учить язык, искать на ruSO работу с двумерными массивами (огромное количество вопросов с ответами...) и т.д.
P.P.S. И — это НЕ "исключение С++". Никаким catch(...) вы его не перехватите...