|
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
|
|||||||||||
Удаление двумерного массива29.07.2015, 09:33. Показов 4718. Ответов 20
Метки нет (Все метки)
Доброго времени суток! Подскажите пожалуйста, как правильно удалить двумерный массив, созданный таким образом:
0
|
|||||||||||
| 29.07.2015, 09:33 | |
|
Ответы с готовыми решениями:
20
Удаление двумерного динамического массива Удаление одинаковых строк двумерного массива Удаление двумерного массива объектов без утечки памяти |
|
Супер-модератор
|
|||||||
| 29.07.2015, 10:00 | |||||||
1
|
|||||||
|
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
|
||||||
| 29.07.2015, 10:07 [ТС] | ||||||
|
volvo, Спасибо! Помогло. Не думал что сами элементы массива удалять обязательно.
Предполагал, что нужно, что-то типа такого:
0
|
||||||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 29.07.2015, 11:11 | |
|
..непонятная для меня вещь получается... - если этот двумерный массив объявлен как общая переменная и на кнопку заведен цикл удаления, предложенный volvo , то на кнопку давишь многократно - и всё ОК, никаких тебе ругательств. Но если только предварительно массив инициализировать ( = new Graphics::TBitmap; ), то кнопка удаления сработает первый раз; потом - сплошной фиолетовый аксэс... . Что поменялось после инициализации для вот этой вот Bitmap_elps[i][j] ?
0
|
|
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
||||||
| 29.07.2015, 12:47 | ||||||
|
- nick42, в циклы volvo надо ставить вот это:
Добавлено через 1 минуту - А вообще-то лучше, наверно, блокировать Button, чтобы не удаляла то, чего нет!
0
|
||||||
|
Супер-модератор
|
||
| 29.07.2015, 12:51 | ||
|
0
|
||
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
||||||
| 29.07.2015, 13:17 | ||||||
|
- volvo, у меня действительно, как и у nick42, тоже при повторном нажатии клавиши - сплошной AV !
Чтобы не было путаницы и недопонимания, вот код:
- При повторном нажатии на клавишу Вы снова пытаетесь удалять (по ненулевым указателям) BitMap-ы, но их то уже НЕТ ! - Без строчки 28-кода при повторном нажатии клавиши - сплошной AV !
1
|
||||||
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 29.07.2015, 14:12 | |
|
Staut, спасибо. Объяснением удовлетворен. Но непонятки на этом не кончились...
Судите сами: поначалу было Access Violation при повторном нажатии Del-кнопки. Добавил строчку с обнулением. Ошибка исчезла. Вернул все обратно (для проверки), перекомпилировал. Теперь при повторном нажатии - Invalid Pointer Operation; программа слетает, но процесс остается в памяти. ... Перегрузился. Почистил папку с проектом (*.tds, *.obj); перекомпилировал... - Invalid Pointer Operation !Пойду напьюсь... .
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 29.07.2015, 16:23 | |
|
Съезжает злой мужик с квартиры. Приходят к нему вандалы-анархисты, чтобы помочь с переездом, а он им показывает на окна и говорит: "выбейте нафик вот эти все окна, они мне больше не нужны".
Проходит время и в ту же квартиру вселяется семья спелеологов-визажистов. Живут себе, никого не трогают, но вдруг однажды, в холодное декабрьское утро раздается леденящий душу звонок в дверь. Папа-визажист несмелой рукой открывает входную дверь, а там стоит, и смотрит прямо на него, злой мужик. И за спиной его бригада вандалов-анархистов. В главных ролях: Злой мужик - Мистер Проппер Вандалы-анархисты - Джорж Клуни и Марк Дакаскас Окна - массив удаляемых данных Менты, ластающие вандалистов - операционная система Ну а на самом деле, происходит попытка удаления чужой уже памяти. В первый раз программа сообщила, посредством функции delete, что данная память именно ей уже больше не нужна. Но указатели на эту память не забыла. И при повторном вызове delete она уже требует удалить память, возможно, выделенную другой программе. Соответственно хрен ей кто это даст сделать. Ну или как-то так все это.
2
|
|
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
|
| 29.07.2015, 16:52 | |
|
- nick42, прошу меня простить! Когда я писал AV, я имел в виду условно "ошибку рантайма".
Фактически у меня тоже вылетало: - "Invalid pointer operation" ! Конечно в таких дисциплинах, как программирование, надо быть максимально конкретным. Еще раз извините. Так что и у меня в XE3 то-же, что и у Вас. - Если описать весь мой эксперимент полностью, то он следующий: (код весь мой Вы видели) - 1) Представьте, что в "конструкторе" - НИЧЕГО НЕТ и в "обработчике клавиши" - оператора обнуления указателя (Bitmaps_...[][] = NULL; ) тоже НЕТ. - При нажатии на клавишу (вижу в отладчике) все указатели во всем массиве == NULL. Поэтому клавишу можно нажимать миллион раз - никакого удаления НЕТ. - 2) Добавляю в "конструктор" - создание всех BitMap-ов ! - Теперь при нажатии клавиши (вижу в отладчике) все указатели во всем массиве != NULL. Поэтому при первом нажатии все уничтожается как надо! Но указатели-то остались хранящими прежнюю информацию (т.е. не нулевыми). И, следовательно, при втором и т.д. нажатиях вылетает "Invalid pointer operation". - 3) Добавление в "обработчик клавиши" оператора обнуления указателя (Bitmaps_...[][] = NULL; ) - полностью решает эту проблему. Вроде все логично ... - Хотя мне, почему-то, больше нравится вариант с блокировкой клавиши: - 1) В "конструкторе" ставим оператор - (Button->Enabled = false; // еще не чего удалять.) - 2) Там, где создаются все BitMap-ы, ставим оператор - (Button->Enabled = true; // разрешить удаление.) - 3) В самом обработчике клавиши ставим оператор - (Button->Enabled = false; // запретить удаление, только-что все удалили.) - Хотя, опять-же, это, если данная клавиша не выполняет кроме удаления BitMap-ов каких-либо других действий ... Добавлено через 5 минут - SatanaXIII, совершенно согласен! Я о том-же самом, только очень длинно и излишне натуралистично!
0
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|||||||
| 29.07.2015, 21:10 | |||||||
|
Всем спасибо за разъяснения. Кстати, выпив, я рассудил трезво, что неповторяемость сообщений тоже объяснима..., - Реакция системы на ошибочную ситуацию зависит от состояния этой самой системы: заполненность стэка, остаток выделенной памяти и т.д. - это всё величины переменные, зависящие от текущего момента. Поэтому глупо ожидать одинаковой реакции в разные моменты времени, пытаясь свести всё в строгую систему, - не для того Билл Гейтс набрал в свою команду сплошь демократов со "свободной подвеской" мозгов. Да, и напоследок еще вопрос от дилетанта: вот такая запись на удаление массива что делает? __
0
|
|||||||
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
|
| 30.07.2015, 09:46 | |
|
- nick42, в конце концов процессор, замученный нашими проблемами, тоже мог сходить "выпить"!
Отсюда и "неповторимость ответов"... - Что касается Вашего примера: - delete [] massiv;, то на мой взгляд этого делать никак нельзя! volvo Вас за это серьезно отругал бы, и был бы абсолютно прав! Цикл volvo удаляет из памяти не массив Bitmaps_...[][], а конкретные экземпляры Bitmap-ов, на которые указывают указатели, хранящиеся в массиве Bitmaps_...[][]. Удалив конкретный Bitmap, по указателю лежащему в ячейке, например, Bitmaps_...[0][3], надо не забыть очистить этот указатель, т.к. он уже ни на что не указывает! Bitmaps_...[0][3] = NULL; - Сам-же массив Bitmaps_...[][], как совершенно правильно писал volvo, статический! Его удалять НЕЛЬЗЯ ! Он будет удален АВТОМАТИЧЕСКИ при завершении приложения ! - Данную тему вообще-то правильнее было бы назвать не "Удаление двухмерного массива", а "Удаление ИЗ двухмерного массива". В этом вся сущность ошибки !
1
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
|
| 30.07.2015, 09:54 | |
|
Как я понял, для двумерного массива - это не подходит, без дополнительных циклов. Но одномерный массив (я проверял на байтовом массиве) по примеру BRcr удаляет корректно, так что, думаю, так делать можно.
0
|
|
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
|
| 30.07.2015, 09:54 | |
|
- В примере BRcr массив (i) тоже выделяется динамически, как и сами Bitmap-ы. Его можно,
и даже нужно удалять, как только он перестает быть нужным. BRcr так и делает: delete [] i; - В моем-же листинге, массив Bitmaps...[][] - выделяется статически и заботиться о его удалении не надо.
0
|
|
|
Практикантроп
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
|
||||||
| 30.07.2015, 10:07 | ||||||
Добавлено через 5 минут P.S. Пока не добавишь вслед за delet'ом msv = NULL . Добавлено через 3 минуты ну, и хватит об этом, а то тему перенесут в "для начинающих"...
0
|
||||||
|
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 594
|
|
| 30.07.2015, 15:32 | |
|
- nick42, да все логично !
- 1) Вы создаете глобальный указатель. Статический. - 2) В "обработчике кнопки 1" Вы: a) создаете (динамически, из кучи) и вешаете на этот глобальный указатель большой массив. b) заполняете его одинаковыми символами. - 3) В "обработчике кнопки 2" Вы: удаляете этот динамический массив (отдаете память массива опять в кучу). - Но глобальный, статический указатель на этот, уже не существующий большой массив, по прежнему указывает на что-то из кучи. Данный проект уже мог запросить из кучи новый массив и куча выделила его как раз в физически той-же, динамической памяти. Так что наш глобальный указатель указывает теперь на что-то совсем другое! - Если Вы теперь снова захотите удалить что-то по этому указателю, то уже будете покушаться на какую-то другую часть проекта, какую, совсем неизвестно ! Рантайм ошибка и не позволяет Вам это сделать ! А вообще-то, действительно, надо прекращать. Могут подумать, что мы "дуркуем". Это сейчас так модно ... Так сейчас развлекаются, а этот форум не для этого !
0
|
|
| 30.07.2015, 21:58 | |
|
Не по теме: Staut, читая посты с обилием восклицательных знаков, я не вольно представляю себе человека, выведенного из равновесия. Кровь прилила к лицу, на виске бешено пульсирует венка, широко распахнутые глаза стреляют с одного оппонента на другого, речь то и дело переходит на крик... Это я так, в порядке лирики. :)
0
|
|
| 31.07.2015, 11:50 | |
|
Не по теме: - BRcr, процентов на 20 так и есть. (Без воскл. знака.)
0
|
|
| 31.07.2015, 12:33 | |
|
Не по теме: А обилие точек в тексте заставляет меня представлять человека, не совсем уверенного в себе. :p
0
|
|
| 31.07.2015, 12:33 | |
|
Помогаю со студенческими работами здесь
20
Удаление из двумерного массива Удаление строк из двумерного массива Удаление строк из двумерного массива
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|