![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Beltar |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Delphi XE3
Есть такой класс:
В общем ничего особенного не содержит кроме ссылки на владельца. И есть контейнер.
Контейнеры являются глобальными (их 2 шт) и создаются всего 1 раз.
Для заполнения контейнеров есть ф-ия. Больше нигде добавление, или исключение объектов не производится.
Если контейнер не пустой, то на вызове Clear происходит AV по нулевому адресу. Значение OwnsObjects, или предварительное уничтожение объектов в контейнере роли не играют, до их деструктора просто не доходит. Аналогичная проблема происходит при попытке уничтожения контейнера. Если включить debug dcu's, то все падает в
Проблему можно обойти, если заменить вызов Clear на
Однако это не отменяет вопроса, что я делаю не так. Вопрос, как подойти к проблеме, судя по нулевому адресу похоже на обращение к несуществующему объекту, но как этот вызов отловить? Просмотр ассемблерного кода в FArrayManager.Move не много дал, хотя скажем прямо с асмом мне работать не приходилось. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
||||||||||||
|
|||||||||||||
Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
может заменить
на
|
||||
|
|||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
А что это даст, если вообще скомпилируется (У TADOQuery вроде Clear нету)? Все, что я делаю, очищаю список и заново заполняю его данными из набора данных Q.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Вот я и не понял, к чему относится Clear.
|
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
FArrayManager = nil ?
|
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Да, nil. И какой из этого вывод?
Ради интереса попробовал юнит с этими классами подключить к чистому проекту, где ничего нет кроме
На FVS.Clear точно такое же AV. Это сообщение отредактировал(а) Beltar - 2.4.2013, 13:17 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Хм... Странно... Я думал, намёка будет достаточно... Тогда отвечу развёрнуто. Я не работал с XE3 и не знаю, что это за класс TArrayManager, хотя и могу догадываться. Однако, судя по всему, FArrayManager является переменной именного этого класса, а судя по префиксу F - это не переменнная, а поле вашего класса. FArrayManager - указатель, который должен указывать на реально существующий объект. Либо вы присваиваете ссылку на уже существующий объект, либо должны создать его сами, например, в собственном конструкторе. Если вы этого не сделали, то в FArrayManager имеется nil, что является ошибкой и при попытке обращения к объекту в большинстве случаев вы получите AV. Что вы и имеете в наличии. |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Нет, это поле класса TList<T>, т. е. кишки, которые я, как пользователь VCL, не трогаю. И это самое странное, если бы я сам где-то раньше времени свой объект убил, или не создал, и ошибка была в моем коде, то 99% проблема бы не прожила и 15 минут после обнаружения.
Есть некоторое подозрение на баг в VCL, тем более что в Delphi XE метод TList<T>.DeleteRange выглядит по другому:
Но это, крайне маловероятно. Все-таки ошибка в TList затронет 95%+ программ. Проект изначально был начат именно в XE, но я не помню, покрывался ли при тестировании сбойный участок. Сам по себе этот участок вызывается один раз при запуске программы, где контейнер пустой и все проходит нормально и в дальнейшем может быть вызван лишь при изменении настроек, что происходит не часто. Пока буду экспериментировать. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 3 Всего: 7 |
Вопрос решен, как обычно, виной всему невнимательность.
Всем спс за участие. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |