0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
||||||
1 | ||||||
Высвобождение памяти Free Си12.11.2019, 21:29. Показов 4094. Ответов 15
В общем столкнулся с такой проблемой не могу высвободить область выделенной памяти . Пожалуйста помогите, а то в притык не вижу как все исправить. P.s В отладчике останавливается на 59 сточке где высвобождаю выделенную память (цикла). Да и советы по динамической выделению памяти дайте.
Вот код:
0
|
12.11.2019, 21:29 | |
Ответы с готовыми решениями:
15
Утечка памяти в free() Корректная очистка памяти через Free Освобождение памяти - операцию free компилятор не пропускает Высвобождение памяти массивов |
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
12.11.2019, 22:23 [ТС] | 3 |
Мнда... тут вроде не 200 строк кода что бы не разобраться лол. Тем более этот пример поможет мне доделать как раз таки прогу где 300 с лишним строк, но раз так не понятно ок.
1. Вызов функции где выделяется динамическая память 2. По оператору выбора (в зависимости от значения k ) будет выполнен определенный программный код case N: 3. Выполняем необходимые вычисления и записываем в память 4. После возвращаем указатель на выделенную область памяти 5. Идет вывод массива на экран 6. Меняем значение k для итерации 7. После идет вызываем повторно функцию где выполняется default Там должен Удалятся исходные вычисленные значения в выделенной памяти. Обнуляется x = NULL. И выделяется повторная память и также вычисляются новые значения для выделенной памяти Вроде все подробно. Добавлено через 4 минуты Да можно было проще сделать, но вот интересно было усложнить запись двумерного массива.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
|
|
13.11.2019, 09:50 | 5 |
Не, массивы тут одномерные. Правда, ТС решил из них собрать указатель на массив массивов, что само по себе то еще извращение.
Вы не учитываете мотивацию. Тут народ сидит и помогает новичкам для удовольствия, из желания решить интересную задачу или предотвратить типичную ошибку. Ковыряться даже в полусотне строк чужого кода, не имея представления что он должен делать, желающих мало. Вы же помните рекомендацию делить программу на модули (классы, функции и т.п.) по ~25 строк в каждой? Чтобы сразу было понятно для чего функция нужна и как ей пользоваться, чтобы ее можно было охватить взглядом. Ну и однобуквенные переменные без комментариев - зло. Вас спрашивали не как программа должна работать по вашему представлению, а что она должна делать в итоге. "Как" можно узнать и из кода, но раз вы пришли с вопросом на форум, в коде наверняка есть ошибки, то есть полагаться на его достоверность нельзя. Так откуда Verevkin'у знать что должна делать программа? Вы передаете в функцию какой-то указатель, не проверяете его, не освобождаете, и тут же выделяете ему кусок памяти. Не знаю какое действие под этим задумывалось, но выглядит как архитектурный косяк. То, что функция называется arr, а аргументы n, m, k, x без комментариев - не просто выглядит как косяк, а совершенно точно им является. switch для двух вариантов? Довольно странное решение, если только не планируется расширение в дальнейшем. Но даже в этом случае правильнее разделить функцию на несколько и вызывать по необходимости: одна функция - одна задача. Я, конечно, не разобрался до конца в этом ужасе, но разве не надо этот указатель сначала разыменовать, и только потом брать индекс? А то у вас указатель на массив массивов, а вы берете индекс от самого указателя, да еще его же и удаляете. В следующей строчке вообще удаляете ссылку на статическую переменную.
0
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
||||||
13.11.2019, 13:36 [ТС] | 6 | |||||
COKPOWEHEU, Мне не стоило с психу отправлять подобный кусок херни. И написать грамотно что и к чему. Да и спасибо насчет критики.
Посмотрите пожалуйста вот этот вариант когда там с присущими комментариями все расписано. Програмка должна выводить двумерный массив при этом под двумерный массив выделяется память в функции void arr(void)
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
||||||
13.11.2019, 13:58 | 7 | |||||
Falck, чуток исправил, чуток подправил. Смотрите:
0
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
13.11.2019, 14:16 [ТС] | 8 |
COKPOWEHEU, Ааа то есть
это получается нужно с начало удалить выделенную память под указатели , а только после удалять выделенную память под количество элементов.
Добавлено через 16 минут liv, Вот это я затупил,нужно было при выделение памяти для количество элементов в цикле поставить i < n И да пару вопросов. 1. Если я высвобождаю выделенную память которая была выделена под указатель ... free(x), а затем высвобождаю то что было выделено циклом будет ли это ошибкой или это практикуется. 2. По поводу архитектуры по коду > как было сказано выше ^ я так понимаю лучше иметь много функций которые решают каждый одну задачу чем много непонятного кода в двух или трех функциях ? Я правильно понимаю ?
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
13.11.2019, 14:24 | 9 |
Falck, 1. Если сначала освободить память массива указателей, т.е.
х , то его содержимое будет потеряно, поэтому осводить память под строки уже не получится. 2. Надо писать так, чтобы было понятно. Это главное. И да, разбивка на мелкие фрагменты, желательно с комментариями, в целом способствует тому, чтобы быстрее понять суть. Добавлено через 1 минуту При освобожении тоже
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
|
||||||
13.11.2019, 14:46 | 10 | |||||
Это вы зря в одну строчку.
Функция scanf: вы ей передаете формат строки, но указатель на символ. Лучше воспользоваться форматом "%c" а еще лучше - getchar(), только будьте внимательнее с пробельными символами после предыдущих операций. Функция выделяет массив массивов, заполняет какими-то значениями, выводит их и освобождает память. Как-то непонятна цель всего этого. Ну и название как было "однобуквенным", так и осталось. Что такое "память под количество элементов"? В функцию у вас передавался указатель на массив массивов. То есть при удалении нужно сначала удалить каждый из вложенных массивов, а потом "внешний" массив. Сам указатель трогать не надо, он вообще константа. Код
int **arr(int n,int m,int k,int ***x) (x) - указатель на массив массивов (что-то, переданное снаружи по ссылке) (*x) - сам массив массивов (он же указатель на первый элемент "внешнего" массива) (**x) - элемент массива массивов ("внутренний" массив) (***x) - элемент "внутреннего" массива, значение Освобождать целиком память от "внутренних" и "внешнего" массива (**x и *x) надо - вы ее выделяли. Освобождать память от указателя на массив массивов снова нельзя, поскольку это ссылка на статическую переменную, а памятью под них заведует компилятор, а не вы. То есть освобождение этой штуки должно выглядеть как (АХТУНГ! писал на форуме, церебральный компилятор забагован)
0
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
13.11.2019, 16:30 [ТС] | 11 |
COKPOWEHEU, Мнда ну и намутил я кашу ! Нужно выделять память точно не подобным образом но почему решил себе жизнь усложнить. Мол а может быть вот так тоже можно. Спасибо за выделенные ошибки. Совет такой дали использовал динамическую память высвободи память и также перед return!
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,059
|
|
13.11.2019, 22:58 | 12 |
Этой грубейше неправильный и безграмотный анти-совет. Одна из главнейших причин использования динамическую памяти - именно возможность НЕ освобождать ее "перед return". Это ключевое свойство динамической памяти, ради которого ее и используют в подавляющем большинстве случаев.
Если время жизни вашей динамической памяти совпадает с временем жизни автоматических переменных (то есть вы ее освобождаете "перед return"), то во многих случаях это означает, что вам вообще не нужна была динамическая память. Освобождать выделенную динамическую память, конечно, надо. Но правила "освобождай "перед return" не существует и никогда не существовало.
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
|
||||||
14.11.2019, 10:07 | 13 | |||||
Сообщение было отмечено Falck как решение
Решение
Вот пример работы с двумерным массивом без 100500 однобуквенных переменных и с разделением выделения-освобождения памяти:
1
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
14.11.2019, 13:42 [ТС] | 14 |
COKPOWEHEU, достаточно интересно, но вот некоторые операции мне непонятны.
Добавлено через 14 минут COKPOWEHEU, Расскажите пожалуйста что проверяет 1. 11 строка и зачем нужны эти операции в индексе массива 2.для чего арифметические операциии в индексе массива 23,24,27,28 строке 3.56 строка тот же вопрос что и выше
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
14.11.2019, 13:57 | 15 |
Falck, это элементарно, Ватсон
Это работа с матрицей, как с одномерным массивом. Длина строки (количество столбцов) = w Значит, индекс 0-го элемента очередной строки = w * i , где i - индекс этой строкиДобавив индекс столбца j , получим индекс элемента [i, j]
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
|
|
14.11.2019, 14:00 | 16 |
Нарисуем массив в виде массива:
Код
a11 a21 a31 ... aW1 a12 a22 a32 ... aW2 a13 a23 a33 ... aW3 ... ... ... . ... a1H a2H a3H ... aWH Код
(a11 a21 a31 ... aW1) (a12 a22 a32 ... aW2) (a13 a23 a33 ... aW3) ... (a1H a2H a3H ... aWH) Ну а навигация внутри строки как была линейной, так и осталась, то есть i-й элемент любой строки будет отстоять на i индексов от ее начала. Скажем, третий элемент 0-й строки займет место 3, третий элемент 1-й строки (3+W), третий элемент 2-й строки (3+2*W) и так далее. Ну и в общем виде линейный индекс элемента [i, j] превращается в [i + W*j]. Самое замечательное, что такое представление прекрасно масштабируется на массивы любой размерности. Скажем, для 4-мерного массива элемент [i,j,k,l] будет выглядеть как [i + j*W + k*W*H + l*W*H*D]. При том, что для машины это все еще единый непрерывный кусок памяти, то есть не нужно никаких тонн выделений - освобождений. Ну и групповые операции - тоже приятный бонус: всякие memcpy, memcmp, memset и т.п.
1
|
14.11.2019, 14:00 | |
14.11.2019, 14:00 | |
Помогаю со студенческими работами здесь
16
Долгое высвобождение памяти Высвобождение динамической памяти Высвобождение памяти компонента Высвобождение памяти статического массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |