|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
||||||
Высвобождение памяти Free Си12.11.2019, 21:29. Показов 4749. Ответов 15
В общем столкнулся с такой проблемой не могу высвободить область выделенной памяти . Пожалуйста помогите, а то в притык не вижу как все исправить. P.s В отладчике останавливается на 59 сточке где высвобождаю выделенную память (цикла). Да и советы по динамической выделению памяти дайте.
Вот код:
0
|
||||||
| 12.11.2019, 21:29 | |
|
Ответы с готовыми решениями:
15
Утечка памяти в free() Корректная очистка памяти через Free Освобождение памяти - операцию free компилятор не пропускает |
|
Злостный нарушитель
10641 / 5792 / 1278
Регистрация: 12.03.2015
Сообщений: 26,737
|
|
| 12.11.2019, 21:35 | |
|
Жэсть какая - 100500 однобуквенных переменных и трёхмерные массивы.
Чо, хоть, прога делать-то должна? -------- Лучше не отвечай, мне и так уже страшно. Кликните здесь для просмотра всего текста
![]()
1
|
|
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
| 12.11.2019, 22:23 [ТС] | |
|
Мнда... тут вроде не 200 строк кода что бы не разобраться лол. Тем более этот пример поможет мне доделать как раз таки прогу где 300 с лишним строк, но раз так не понятно ок.
1. Вызов функции где выделяется динамическая память 2. По оператору выбора (в зависимости от значения k ) будет выполнен определенный программный код case N: 3. Выполняем необходимые вычисления и записываем в память 4. После возвращаем указатель на выделенную область памяти 5. Идет вывод массива на экран 6. Меняем значение k для итерации 7. После идет вызываем повторно функцию где выполняется default Там должен Удалятся исходные вычисленные значения в выделенной памяти. Обнуляется x = NULL. И выделяется повторная память и также вычисляются новые значения для выделенной памяти Вроде все подробно. Добавлено через 4 минуты Да можно было проще сделать, но вот интересно было усложнить запись двумерного массива.
0
|
|
|
Злостный нарушитель
10641 / 5792 / 1278
Регистрация: 12.03.2015
Сообщений: 26,737
|
|
| 12.11.2019, 22:51 | |
|
0
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
|
||||||||
| 13.11.2019, 09:50 | ||||||||
|
Ковыряться даже в полусотне строк чужого кода, не имея представления что он должен делать, желающих мало. Ну и однобуквенные переменные без комментариев - зло. То, что функция называется arr, а аргументы n, m, k, x без комментариев - не просто выглядит как косяк, а совершенно точно им является. Но даже в этом случае правильнее разделить функцию на несколько и вызывать по необходимости: одна функция - одна задача.
0
|
||||||||
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
||||||
| 13.11.2019, 13:36 [ТС] | ||||||
|
COKPOWEHEU, Мне не стоило с психу отправлять подобный кусок херни. И написать грамотно что и к чему. Да и спасибо насчет критики.
Посмотрите пожалуйста вот этот вариант когда там с присущими комментариями все расписано. Програмка должна выводить двумерный массив при этом под двумерный массив выделяется память в функции void arr(void)
0
|
||||||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||||||
| 13.11.2019, 13:58 | ||||||
|
Falck, чуток исправил, чуток подправил. Смотрите:
0
|
||||||
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|||||
| 13.11.2019, 14:16 [ТС] | |||||
|
Добавлено через 16 минут liv, Вот это я затупил,нужно было при выделение памяти для количество элементов в цикле поставить i < n 1. Если я высвобождаю выделенную память которая была выделена под указатель free(x), а затем высвобождаю то что было выделено циклом будет ли это ошибкой или это практикуется. 2. По поводу архитектуры по коду > как было сказано выше ^ я так понимаю лучше иметь много функций которые решают каждый одну задачу чем много непонятного кода в двух или трех функциях ? Я правильно понимаю ?
0
|
|||||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 13.11.2019, 14:24 | ||
|
Falck, 1. Если сначала освободить память массива указателей, т.е.
х, то его содержимое будет потеряно, поэтому осводить память под строки уже не получится. ![]() 2. Надо писать так, чтобы было понятно. Это главное. И да, разбивка на мелкие фрагменты, желательно с комментариями, в целом способствует тому, чтобы быстрее понять суть. Добавлено через 1 минуту
1
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
|
|||||||||||||||
| 13.11.2019, 14:46 | |||||||||||||||
|
Функция scanf: вы ей передаете формат строки, но указатель на символ. Лучше воспользоваться форматом "%c" а еще лучше - getchar(), только будьте внимательнее с пробельными символами после предыдущих операций. В функцию у вас передавался указатель на массив массивов. То есть при удалении нужно сначала удалить каждый из вложенных массивов, а потом "внешний" массив. Сам указатель трогать не надо, он вообще константа.
Освобождать целиком память от "внутренних" и "внешнего" массива (**x и *x) надо - вы ее выделяли. Освобождать память от указателя на массив массивов снова нельзя, поскольку это ссылка на статическую переменную, а памятью под них заведует компилятор, а не вы. То есть освобождение этой штуки должно выглядеть как (АХТУНГ! писал на форуме, церебральный компилятор забагован)
0
|
|||||||||||||||
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
| 13.11.2019, 16:30 [ТС] | |
|
COKPOWEHEU, Мнда ну и намутил я кашу ! Нужно выделять память точно не подобным образом но почему решил себе жизнь усложнить. Мол а может быть вот так тоже можно. Спасибо за выделенные ошибки. Совет такой дали использовал динамическую память высвободи память и также перед return!
0
|
|
|
Вездепух
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,259
|
||
| 13.11.2019, 22:58 | ||
|
Если время жизни вашей динамической памяти совпадает с временем жизни автоматических переменных (то есть вы ее освобождаете "перед return"), то во многих случаях это означает, что вам вообще не нужна была динамическая память. Освобождать выделенную динамическую память, конечно, надо. Но правила "освобождай "перед return" не существует и никогда не существовало.
1
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
|
||||||
| 14.11.2019, 10:07 | ||||||
Сообщение было отмечено Falck как решение
Решение
Вот пример работы с двумерным массивом без 100500 однобуквенных переменных и с разделением выделения-освобождения памяти:
1
|
||||||
|
0 / 0 / 0
Регистрация: 04.09.2019
Сообщений: 15
|
|
| 14.11.2019, 13:42 [ТС] | |
|
COKPOWEHEU, достаточно интересно, но вот некоторые операции мне непонятны.
Добавлено через 14 минут COKPOWEHEU, Расскажите пожалуйста что проверяет 1. 11 строка и зачем нужны эти операции в индексе массива 2.для чего арифметические операциии в индексе массива 23,24,27,28 строке 3.56 строка тот же вопрос что и выше
0
|
|
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 14.11.2019, 13:57 | |
|
Falck, это элементарно, Ватсон
![]() Это работа с матрицей, как с одномерным массивом. Длина строки (количество столбцов) = wЗначит, индекс 0-го элемента очередной строки = w * i, где i - индекс этой строкиДобавив индекс столбца j, получим индекс элемента [i, j]
1
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,929
|
|||||||||||
| 14.11.2019, 14:00 | |||||||||||
|
Нарисуем массив в виде массива:
Ну а навигация внутри строки как была линейной, так и осталась, то есть 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 | |
|
Помогаю со студенческими работами здесь
16
Высвобождение памяти массивов Долгое высвобождение памяти Высвобождение динамической памяти Высвобождение памяти компонента
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|