Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Очистка списка указателей.


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 не "пуста", тоесть
> содержит данные

Точно?


Наверх

Титульная страница Поиск, карта сайта Написать письмо