Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
14-1108747330
mrQ
2005-02-18 20:22
2005.03.13
Аудио книги


4-1107077312
rimd
2005-01-30 12:28
2005.03.13
CreateThread-совместное использование кода


6-1105474757
BigError
2005-01-11 23:19
2005.03.13
Проблемы с переходом на Indy 10


3-1108442952
Tigerr
2005-02-15 07:49
2005.03.13
Удаление записи из БД


14-1108938248
ЦУКОР5
2005-02-21 01:24
2005.03.13
настройка гридов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский