Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Очистка списка указателей.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
1-1109494266
Guitar
2005-02-27 11:51
2005.03.13
Цифровая фильтрация сглаживание в примерах Delphi


4-1106817578
Poha
2005-01-27 12:19
2005.03.13
NumLock


3-1108361995
Некто
2005-02-14 09:19
2005.03.13
Запросы от многих пользователей


1-1109323904
webpauk
2005-02-25 12:31
2005.03.13
Обращение к классам


6-1104724424
Konstantin
2005-01-03 06:53
2005.03.13
Избранное как в IE