Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2019, 12:22   #21
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

У вас в matr копии указателей из Arr. Вы их один раз удалили, но не за нулили, потом второй раз... Читайте дальше.
p51x вне форума Ответить с цитированием
Старый 10.11.2019, 12:53   #22
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
У вас в matr копии указателей из Arr. Вы их один раз удалили, но не за нулили, потом второй раз... Читайте дальше.
Ага, теперь понял, почему программа рухнула - я заодно грохнул основной массив.
archerix вне форума Ответить с цитированием
Старый 10.11.2019, 17:55   #23
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

archerix, они там не построчно копируют, а указатели копируют. Осторожно надо с освобождением памяти
Алексей1153 вне форума Ответить с цитированием
Старый 10.11.2019, 19:09   #24
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Для человека, пока не привыкшего к таким опытам с памятью, все это выглядит как бред сумасшедшего - присвоили строку одной матрицы другой, да еще имеющие разный размер
archerix вне форума Ответить с цитированием
Старый 10.11.2019, 19:38   #25
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

"размерности" сходятся, точнее - типы.

int**Arr; - указатель на указатель
matr - тоже

Arr[i] - имеет тип int*
matr - nоже

копирование указателя
matr[j]=Arr[j];

теперь matr[j] и Arr[j] указывают на один и тот же участок памяти

поэтому, delete можно вызвать только один раз. Если вызвали delete [] Arr[j], то и память, на которую указывает сейчас matr[j] тоже освободилась. Получаем невалидный указатель. При попытке delete [] matr[j] получаем краш
Алексей1153 вне форума Ответить с цитированием
Старый 10.11.2019, 22:57   #26
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Ну, вот, например, объявляем два динамических массива разного размера и присваиваем их строки друг другу - смотрим, все работает. Может, это неграмотная интерпретация, но так легче понять

Код:
       
        int size=4;
        int**Arr;
        int**Arr1;

        srand(time(NULL));

        Arr=new int*[size];
        for(int i=0;i<size;++i)
                Arr[i]=new int[size];

        Arr1=new int*[size-1];
        for(int i=0;i<size-1;++i)
                Arr1[i]=new int[size-1];


        for(int i=0;i<size;++i)
                for(int j=0;j<size;++j) {
                        Arr[i][j]=rand()%5+2;
                       }
        for(int i=0;i<size-1;++i)
                for(int j=0;j<size-1;++j) {
                        Arr1[i][j]=0;
                       }

Arr1[0]=Arr[0];

        for(int i=0;i<size;++i)
        {
                for(int j=0;j<size;++j)
                        cout<<Arr[i][j]<<' ';
                cout<<endl;
        }

cout<<endl;
cout<<endl;

        for(int i=0;i<size-1;++i)
        {
                for(int j=0;j<size-1;++j)
                        cout<<Arr1[i][j]<<' ';
                cout<<endl;
        }

cout<<endl;
cout<<endl;
archerix вне форума Ответить с цитированием
Старый 11.11.2019, 07:59   #27
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
присваиваем их строки друг другу
присваиваются не строки, а копируются указатели. Но это ты просто память не освобождаешь в кучу, поэтому у тебя это "работает"

Попробуй после строки
Arr1[0]=Arr[0];
удалить память массива Arr, потом проверь, как у тебя "работает" Arr1
Алексей1153 вне форума Ответить с цитированием
Старый 11.11.2019, 10:51   #28
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Уже поэкспериментировал

Если так, то в Arr1 потом содержится всякий мусор.
Код:
for(int i=0;i<size;++i)
delete[] Arr[i];
delete[] Arr;
Если только эту строчку оставить, то продолжает работать.
Код:
delete[] Arr;
Осталось осмыслить теорию Явно в статьях этого момента вроде не видел - видимо, авторам это казалось очевидным.

Последний раз редактировалось archerix; 11.11.2019 в 11:59.
archerix вне форума Ответить с цитированием
Старый 11.11.2019, 12:32   #29
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

То есть при удалении массива Arr "построчно" освобождается и занимаемая им память. А "приравненный" к нему массив Arr1 физически своей памяти не имеет, а берет значения из области памяти, выделенной для Arr. Потому после этого в его элементах появляется всякий случайный мусор.

Если написать только delete[] Arr, память не освобождается, судя по тому, что Arr1 продолжает выдавать осмысленные значения. Тут мне не очень понятно, есть ли большой смысл в таком частичном удалении матрицы минора в той программе детерминанта - дает ли это заметную экономию памяти или написано просто для порядка?

Код:
matr=new int*[size-1];     
for(i=0;i<size;++i) {
for(j=0;j<size-1;++j) {
if(j<i)
   matr[j]=Arr[j];     
else
   matr[j]=Arr[j+1];
}
det+=pow((double)-1, (i+j))*determ(matr, size-1)*Arr[i][size-1];
}
delete[] matr;

Последний раз редактировалось archerix; 11.11.2019 в 12:36.
archerix вне форума Ответить с цитированием
Старый 11.11.2019, 12:37   #30
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от archerix Посмотреть сообщение
То есть при удалении массива Arr "построчно" освобождается и занимаемая им память.
Нет. "Построчно" вы просто проходите по элементам массива - указателям и удаляете память, на которую они указывают.

Цитата:
Сообщение от archerix Посмотреть сообщение
"приравненный" к нему массив Arr1 физически своей памяти не имеет, а берет значения из области памяти, выделенной для Arr.
Нет. Имеет. Не берет, а после присваивания указатели указывают на тоже место, на которое указывали в исходном.

Цитата:
Сообщение от archerix Посмотреть сообщение
Потому после этого в его элементах появляется всякий случайный мусор.
Нет. Потому что вы освободили память и там может быть что угодно.

Цитата:
Сообщение от archerix Посмотреть сообщение
Если написать только delete[] Arr, память не освобождается, судя по тому, что Arr1 продолжает выдавать осмысленные значения.
Какая память? Которая под Arr1 освобождается.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая создает динамическую матрицу размерности A[nxn] Ivanrik Общие вопросы C/C++ 0 25.11.2018 09:03
сгенерировать матрицу размерности М х К из случайных вещественных чисел из интервала [-25,40] AVIM Общие вопросы C/C++ 1 12.02.2016 23:00
Как передать параметр функции в const? Mik92 Общие вопросы Delphi 8 01.12.2014 16:56
Заполнить матрицу Р размерности m x n значениями элементов вектора Q размерности k = m x n Olevander Помощь студентам 0 23.11.2014 10:09
функция, способная сгенерировать массив любой размерности. papapapokerface Общие вопросы C/C++ 2 03.06.2010 14:33