![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очистка списка указателей.
novice_man © (2005-02-24 20:13:00)Ув. мастера, возникает ошибка доступа, при выполнении нижеприведенного кода
var
PosRead, CountRecord: integer;
ItemMy: pItemsMy;
begin
PosRead := 0;
CountRecord := ListItems.Count;
while PosRead < CountRecord do begin
ItemMy := ListItems.Items[PosRead];
Dispose(ItemMy); <<-- ошибка "EInvalidPointer with message "Invalid pointer operation"
inc(PosRead);
end;
end;
примечание:ListItems: TListглобальная переменная в модуле, переменнаяItemMyна момент вызова Dispose не "пуста", тоесть содержит данные.
Данный код очищает список динамических указателей, т.к. переменнаяListItems: TListдоступна только из этого модуля, то данные передаю в другие модули примерно так:
procedure GetListData(var ListData: TList);
begin
ListData.Assign(ListItems, laCopy);
end;
Пробовал не вызыватьGetListData, но все одно, ошибка. Как ее избежать?
WinXP, Delphi6.
Набережных С. (2005-02-25 06:24:00) [1]
> novice_man © (25.02.05 05:54) [12]
Вызов Free не обнуляет сам переменную, и последующая проверка Assigned не поможет. Но это так, к слову. Чудес не бывает. Как я понял, управляемых типов у тебя в рекорде нет. Следовательно, EInvalidPointer возбуждается внутри FreeMem. Так как Item указывает все-таки на реальный рекорд, то наиболее вероятно, что имеет место повторная попытка освобождения памяти, тем более, что менеджер не обязательно уже освободил страницу. А впрочем, как знаешь...
novice_man (2005-02-25 05:54:00) [2]Набережных С. © (24.02.05 21:50)
После очистки записей, список уничтожается ListItems.Free;:(
novice_man (2005-02-25 05:48:00) [3]Набережных С. © (24.02.05 21:27)
CountRecord := ListItems.Count;на этой строке брекпоинт, и если бы я пытался очистить список дважды, то я бы видел это.
А главное, вызов процедуры очистки вызывается так:if Assigned(ListItems) then FreeListItems;и нигде больше не вызываю эту процедуру, проверял закомментировав эту процедуру.
Набережных С. (2005-02-24 21:50:00) [4]У тя вон че там есть
procedure GetListData(var ListData: TList);
begin
ListData.Assign(ListItems, laCopy);
end
А ассигнуются-то указатели, а не рекорды. Мож еще где такое. Да и не обнуляешь ты итемы при очистке листа. Так что копай в эту сторону.
Набережных С. (2005-02-24 21:27:00) [5]Да ты проверь, проверь
novice_man (2005-02-24 21:20:00) [6]Набережных С. © (24.02.05 21:07) [7]
переменная ItemMy на момент вызова Dispose не "пуста",
Проверял в Evaluate/Modify все поля содержат корректные данные.
Все в по шаговой отладке.
Набережных С. (2005-02-24 21:07:00) [7]Подозрение, что лист очищается дважды. Поставь на очистку точку останова перед запуском программы и посмотри, нет ли повторного вызова
novice_man (2005-02-24 20:55:00) [8]begin...end © (24.02.05 20:48) [5]
Так точно. Вот ,блин, на работе было все нормально. Припер домой, весь каталог проекта, думал поработать. Но на работе Win2000 а дома WinXP. И еще возникло подазрение на Delphi. Давненько уже работает и много каких "левых" компанентов стави/удалял, может где оригинальные модули попортил (IniFiles точно). Может из за этого? Завтра переставлю Delphi и посмотрю, но это если на работе все завтра заработает.
begin...end (2005-02-24 20:48:00) [9]> novice_man © (24.02.05 20:37) [4]
> ItemMy содержит в основном текстовые данные
> (ShortString).
Т.е. длинных строк там нет?
Если освобождать в том же модуле, где объявлена переменная ListItems (без всяких GetListData), ошибка всё равно возникает?
novice_man (2005-02-24 20:37:00) [10]begin...end © (24.02.05 20:24)
> То, что эта переменная не "пуста", ещё не означает,
> что она указывает на данные, память под которые
> выделили именно Вы. Вы её выделяете? New где-нибудь
> есть?
Проверял в Evaluate/Modify все поля содержат корректные данные.
Заполнял примерно так:
....
New(ItemMy);
ItemMy^.Field_1 := '1111';
....
ItemMy^.Field_n := 'nnnn';
ListItems.Add(ItemMy);
....
ItemMy содержит в основном текстовые данные (ShortString).
begin...end (2005-02-24 20:24:00) [11]> novice_man © (24.02.05 20:13)
> переменная ItemMy на момент вызова Dispose не "пуста",
> тоесть содержит данные
То, что эта переменная не "пуста", ещё не означает, что она указывает на данные, память под которые выделили именно Вы. Вы её выделяете? New где-нибудь есть?
novice_man (2005-02-24 20:22:00) [12]TUser © (24.02.05 20:19) [1]
Проверял. Сразу подумал, что так и есть, но не так все просто.
TUser (2005-02-24 20:19:00) [13]
> переменная ItemMy на момент вызова Dispose не "пуста", тоесть
> содержит данные
Точно?