| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Access Violation с TObjectList<T> |
| Автор: Beltar 1.4.2013, 15:53 | ||||||||||||
| Delphi XE3 Есть такой класс:
В общем ничего особенного не содержит кроме ссылки на владельца. И есть контейнер.
Контейнеры являются глобальными (их 2 шт) и создаются всего 1 раз.
Для заполнения контейнеров есть ф-ия. Больше нигде добавление, или исключение объектов не производится.
Если контейнер не пустой, то на вызове Clear происходит AV по нулевому адресу. Значение OwnsObjects, или предварительное уничтожение объектов в контейнере роли не играют, до их деструктора просто не доходит. Аналогичная проблема происходит при попытке уничтожения контейнера. Если включить debug dcu's, то все падает в
Проблему можно обойти, если заменить вызов Clear на
Однако это не отменяет вопроса, что я делаю не так. Вопрос, как подойти к проблеме, судя по нулевому адресу похоже на обращение к несуществующему объекту, но как этот вызов отловить? Просмотр ассемблерного кода в FArrayManager.Move не много дал, хотя скажем прямо с асмом мне работать не приходилось. |
| Автор: Akella 1.4.2013, 21:58 | ||||
может заменить
на
|
| Автор: Beltar 1.4.2013, 22:43 |
| А что это даст, если вообще скомпилируется (У TADOQuery вроде Clear нету)? Все, что я делаю, очищаю список и заново заполняю его данными из набора данных Q. |
| Автор: Akella 1.4.2013, 23:19 |
| Вот я и не понял, к чему относится Clear. |
| Автор: БелАмор 1.4.2013, 23:48 |
| FArrayManager = nil ? |
| Автор: Beltar 2.4.2013, 12:43 | ||
| Да, nil. И какой из этого вывод? Ради интереса попробовал юнит с этими классами подключить к чистому проекту, где ничего нет кроме
На FVS.Clear точно такое же AV. |
| Автор: БелАмор 2.4.2013, 15:39 |
Хм... Странно... Я думал, намёка будет достаточно... Тогда отвечу развёрнуто. Я не работал с XE3 и не знаю, что это за класс TArrayManager, хотя и могу догадываться. Однако, судя по всему, FArrayManager является переменной именного этого класса, а судя по префиксу F - это не переменнная, а поле вашего класса. FArrayManager - указатель, который должен указывать на реально существующий объект. Либо вы присваиваете ссылку на уже существующий объект, либо должны создать его сами, например, в собственном конструкторе. Если вы этого не сделали, то в FArrayManager имеется nil, что является ошибкой и при попытке обращения к объекту в большинстве случаев вы получите AV. Что вы и имеете в наличии. |
| Автор: Beltar 2.4.2013, 19:04 | ||
| Нет, это поле класса TList<T>, т. е. кишки, которые я, как пользователь VCL, не трогаю. И это самое странное, если бы я сам где-то раньше времени свой объект убил, или не создал, и ошибка была в моем коде, то 99% проблема бы не прожила и 15 минут после обнаружения. Есть некоторое подозрение на баг в VCL, тем более что в Delphi XE метод TList<T>.DeleteRange выглядит по другому:
Но это, крайне маловероятно. Все-таки ошибка в TList затронет 95%+ программ. Проект изначально был начат именно в XE, но я не помню, покрывался ли при тестировании сбойный участок. Сам по себе этот участок вызывается один раз при запуске программы, где контейнер пустой и все проходит нормально и в дальнейшем может быть вызван лишь при изменении настроек, что происходит не часто. Пока буду экспериментировать. |
| Автор: Beltar 2.4.2013, 19:41 | ||
Вопрос решен, как обычно, виной всему невнимательность.
Всем спс за участие. |