ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
|||||||||||
1 | |||||||||||
Помошь пользование TList ом26.03.2013, 22:44. Показов 2477. Ответов 8
Метки нет (Все метки)
Помогите, кто сталкивался, проблема следующая, имеется список
Добавлено через 9 минут Проблема решена решение
Все мы привыкли к тому, что значение переменной цикла должно увеличиваться. Именно в этом-то и заключается ошибка. Предположим, что в массиве находится три элемента. В таком случае код в цикле будет выполнен три раза: для индексов 0, 1 и 2. Пусть при первом выполнении цикла условие выполняется. При этом освобождается объект с индексом 0, а затем элемент с индексом 0 удаляется из списка. После первого выполнения цикла в списке остается два элемента, но их индексы теперь 0 и 1, а не 1 и 2. При втором выполнении цикла, при соблюдении условия, освобождается объект с индексом 1 (который, если вы помните, был изначально элементом с индексом 2), после чего удаляется элемент с индексом 1. После этого в списке остается всего один элемент. И его индекс 0. При третьем выполнении цикла код пытается освободить память, ранее выделенную под объект, индекс которого 2, и в результате генерируется исключение "list index out of bounds".
источник
0
|
26.03.2013, 22:44 | |
Ответы с готовыми решениями:
8
Пользование Нэтом. пользование Ubuntu Правильное пользование батареей плата за пользование телефоном |
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
||||||||||||||||
26.03.2013, 22:55 [ТС] | 3 | |||||||||||||||
Вы имеете ввиду такую конструкцию?
0
|
Пишу на Delphi...иногда
|
|
26.03.2013, 23:01 | 4 |
нет, просто MyList.Clear; но тут не будет освобождения памяти, которая выделена под элементы списка, впрочем, как и в случае простого удаления элементов списка в цикле, который приведен у вас
0
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
26.03.2013, 23:09 | 5 |
Да нишиша ничего не решилось, не выдумывай.
Фактическая деаллокация памяти, занятой списком, контролируемым объектом класса TList, выполняется след.образом: List.Capacity := 0;
0
|
ComfyMobile
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
|
|||||||||||
26.03.2013, 23:14 [ТС] | 6 | ||||||||||
Добавлено через 2 минуты не согласен, опять же исходник если взять то
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
26.03.2013, 23:22 | 7 |
Nixy, в TList используется массив указателей. И вызов TList.Clear() или TList.Delete() не приводит к изменению длины этого массива. Именно об этом говорил mss.
0
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
26.03.2013, 23:25 | 8 |
Чего удаляет-то ?
Ничего не удаляет. Всего лишь "перетасовывает" содержимое блока аллокированной памяти, корректируя счетчик размера списка. Вот Clear - он и счетчик обнуляет и блок в кучу возвращает. А то что в исх-ки глянул - молодец.
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
26.03.2013, 23:27 | 9 |
Да, точно - в TList.Clear() устанавливается SetCapacity(0).
Добавлено через 28 секунд А TList.Delete() на размер массива не влияет.
0
|
26.03.2013, 23:27 | |
26.03.2013, 23:27 | |
Помогаю со студенческими работами здесь
9
пользование INI файлами Разрешения на пользование папкой Обойти запрет на пользование торрентами. Составить программу за пользование телефоном Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |