Вызвано исключение С++

Рейтинг: -6Ответов: 1Опубликовано: 04.05.2023
        #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;
}

Ответы

▲ 4

Как все запущено...

  1. В конструкторе

    int** arr = new int* [rows];
    

    Этот arr — локальная переменная, и к члену arr не имеет никакого отношения.

  2. Далее, выделена память под массив указателей, но не выделена память для самих элементов. Так что arr[i] указывает в никуда (вообще-то в основном потому, что см. п.1), так что еще один повод для UB.

  3. delete[]*arr; — это вообще бред, и не только из-за пункта 1, но и потому, что это просто попытка освобождения памяти по адресу в первом элементе массива arr и не более того. Которая, напомним, не выделена.

P.S. Ответ на вопрос "как это исправить?" — заранее: учить язык, искать на ruSO работу с двумерными массивами (огромное количество вопросов с ответами...) и т.д.

P.P.S. И — это НЕ "исключение С++". Никаким catch(...) вы его не перехватите...