Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизОчистка списка указателей. Найти похожие ветки
← →
novice_man © (2005-02-24 20:13) [0]Ув. мастера, возникает ошибка доступа, при выполнении нижеприведенного кода
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.
← →
TUser © (2005-02-24 20:19) [1]
> переменная ItemMy на момент вызова Dispose не "пуста", тоесть
> содержит данные
Точно?
← →
novice_man © (2005-02-24 20:22) [2]TUser © (24.02.05 20:19) [1]
Проверял. Сразу подумал, что так и есть, но не так все просто.
← →
begin...end © (2005-02-24 20:24) [3]> novice_man © (24.02.05 20:13)
> переменная ItemMy на момент вызова Dispose не "пуста",
> тоесть содержит данные
То, что эта переменная не "пуста", ещё не означает, что она указывает на данные, память под которые выделили именно Вы. Вы её выделяете? New где-нибудь есть?
← →
novice_man © (2005-02-24 20:37) [4]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:48) [5]> novice_man © (24.02.05 20:37) [4]
> ItemMy содержит в основном текстовые данные
> (ShortString).
Т.е. длинных строк там нет?
Если освобождать в том же модуле, где объявлена переменная ListItems (без всяких GetListData), ошибка всё равно возникает?
← →
novice_man © (2005-02-24 20:55) [6]begin...end © (24.02.05 20:48) [5]
Так точно. Вот ,блин, на работе было все нормально. Припер домой, весь каталог проекта, думал поработать. Но на работе Win2000 а дома WinXP. И еще возникло подазрение на Delphi. Давненько уже работает и много каких "левых" компанентов стави/удалял, может где оригинальные модули попортил (IniFiles точно). Может из за этого? Завтра переставлю Delphi и посмотрю, но это если на работе все завтра заработает.
← →
Набережных С. © (2005-02-24 21:07) [7]Подозрение, что лист очищается дважды. Поставь на очистку точку останова перед запуском программы и посмотри, нет ли повторного вызова
← →
novice_man © (2005-02-24 21:20) [8]Набережных С. © (24.02.05 21:07) [7]
переменная ItemMy на момент вызова Dispose не "пуста",
Проверял в Evaluate/Modify все поля содержат корректные данные.
Все в по шаговой отладке.
← →
Набережных С. © (2005-02-24 21:27) [9]Да ты проверь, проверь
← →
Набережных С. © (2005-02-24 21:50) [10]У тя вон че там есть
procedure GetListData(var ListData: TList);
begin
ListData.Assign(ListItems, laCopy);
end
А ассигнуются-то указатели, а не рекорды. Мож еще где такое. Да и не обнуляешь ты итемы при очистке листа. Так что копай в эту сторону.
← →
novice_man © (2005-02-25 05:48) [11]Набережных С. © (24.02.05 21:27)
CountRecord := ListItems.Count;
на этой строке брекпоинт, и если бы я пытался очистить список дважды, то я бы видел это.
А главное, вызов процедуры очистки вызывается так:if Assigned(ListItems) then FreeListItems;
и нигде больше не вызываю эту процедуру, проверял закомментировав эту процедуру.
← →
novice_man © (2005-02-25 05:54) [12]Набережных С. © (24.02.05 21:50)
После очистки записей, список уничтожается ListItems.Free; :(
← →
Набережных С. © (2005-02-25 06:24) [13]
> novice_man © (25.02.05 05:54) [12]
Вызов Free не обнуляет сам переменную, и последующая проверка Assigned не поможет. Но это так, к слову. Чудес не бывает. Как я понял, управляемых типов у тебя в рекорде нет. Следовательно, EInvalidPointer возбуждается внутри FreeMem. Так как Item указывает все-таки на реальный рекорд, то наиболее вероятно, что имеет место повторная попытка освобождения памяти, тем более, что менеджер не обязательно уже освободил страницу. А впрочем, как знаешь...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c