|
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
|
|||||||||||
Удаление элемента из дин. массива дин. массивов.29.05.2011, 22:27. Показов 6935. Ответов 5
Метки нет (Все метки)
Есть динамический массив динамических массивов. Когда я удаляю элемент с этого массива, то с последнего элемента пропадают все данные, а потом вообще появляются абсолютно левые числа. Это в случае, если элемент не является последним. Если удаляю последний элемент то вроде все норм.
Тип элементов массива.
0
|
|||||||||||
| 29.05.2011, 22:27 | |
|
Ответы с готовыми решениями:
5
Дин. массив (Delphi) Дин.переменные,Указатели (Delphi) |
|
28 / 28 / 3
Регистрация: 14.04.2011
Сообщений: 101
|
||||||
| 29.05.2011, 22:48 | ||||||
|
Больно наварочено. При чем здесь Move. Я в свое время удалял так, правда массив интежер:
0
|
||||||
|
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
|
||||||||||||||||||||
| 30.05.2011, 10:44 [ТС] | ||||||||||||||||||||
|
Добавлено через 11 часов 6 минут проблема в удалении строки в двумерном динамическом массиве... Добавлено через 18 минут Вот данные которые хранятся в массиве. Скажем я хочу удалить элемент под номером 250.
Я так понимаю, что после перестановки элементов, последний и предпоследний элементы указываются на один и тот же массив указателей (дин. массив - это ведь массив указателей на элементы типа этого массива?). Когда убиваем последний элемент, то массив, на который он указывает тоже помирает, а предпоследний указывает теперь на хз что. Если сделать примерно вот так, то все будет ок. Способ правда мне не очень нравится, мб есть и получше?
0
|
||||||||||||||||||||
|
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||
| 30.05.2011, 13:15 | ||||||||
Сейчас расскажу. Перед удалением, на последнюю строку (на последний элемент в первой размерности массива) ссылается вот этот указатель: ArcArray[L]. Потом мы удаляем один элемент таким образом, что просто все элементы сдвигаем на одну позицию в строну начала массива. И делаем это с помощью вызова функции Move(). Что теперь получилось? А получилось то, что теперь на последний элемент ссылается ещё один элемент массива, вот этот: ArcArray[L - 1]. Т. е., теперь первой особенностью сложившейся ситуации является то, что на один и ту же строку ссылаются 2 элемента: ArcArray[L] и ArcArray[L - 1]. Второй особенностью является следующее: менеджер памяти Delphi не знает о том, что теперь на один и тот же массив ссылаются 2 переменные, а не одна. Не знает он об этом потому что он не в курсе о том, как влияет на массив функция Move(). Менеджер памяти по прежнему считает, что указатель на строку только один. Поэтому у строки (массива по второй размерности) счётчик ссылок равен 1 (равен единице). Далее, последняя строка уничтожается: ArcArray[L] := nil. При этом действии менеджер памяти Delphi уменьшает счётчик ссылок на единицу, в результате счётчик оказывается обнулён. А в случае обнуления счётчика ссылок менеджер памяти удаляет такой динамический объект (массив) из памяти.Именно поэтому, после такого удаления строки и присваивания ArcArray[L] := nil, элемент ArcArray[L - 1] будет ссылаться на область освобождённой памяти. И в этой области уже может быть мусор. Либо эта область может быть отдана системе, тогда вообще возникнет исключение Access Violation (память не может быть Read или Wrire). --- Более того, та строка (тот массив по второй размерности), который мы якобы удалили, не удалён на самом деле и остался в памяти. Т. е., произошла утечка памяти. Как я уже говорил, менеджер памяти Delphi не может отследить что делает с указателями процедура Move(). Поэтому счётчик ссылок на ту строку которую мы хотели удалить не поменялся, а значит менеджер памяти её не удалил из памяти. В добавок при сдвиге мы потеряли указатель на ту строку и теперь никак не сможем освободить память из под той строки. --- Кроме этого, сама последовательность операций неверная: --- Удалять в этом случае надо так:
2
|
||||||||
|
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
|
|
| 30.05.2011, 15:15 [ТС] | |
|
Большое спасибо. Если вам не трудно, скопируйте ваш пост в эту тему
Динамические массивы в Delphi думаю многим будет полезно ![]() Хм, все равно бывают потери данных с использованием такого способа удаления
1
|
|
|
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||||||||
| 31.05.2011, 10:54 | ||||||||||||||||||
Сообщение было отмечено как решение
Решение
--- Вывод такой - следует отказаться от применения процедуры Move() в этом коде удаления. И заменить её на такой код:
3
|
||||||||||||||||||
| 31.05.2011, 10:54 | |
|
Помогаю со студенческими работами здесь
6
Ограничение ввода в дин-ком Edit Утечка памяти JSON + дин.массив Последовательность отображения компонентов при дин. создании из дин. дека в дин. стек (Borland С++) Добавление и удаление элементов дин массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|