Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2007, 17:00   #1
novicer
 
Регистрация: 06.05.2007
Сообщений: 6
По умолчанию Проблема с указателями

Суть вот в чём:

есть список cl2 и список MCList, в котором должны в данный момент времени содержатся часть элементов из cl2. Реализовано это так:

cl2.LoadChainForAllContracts(listof IDs);

for i := minBORD to maxBORD do
begin


MClist := TContractList.create;

for cntr := 0 to cl2.count - 1 do
begin
if cl2[cntr].Current_loadby_ID = cl.id then (*****************)
Begin
MClist.Add(cl2[cntr]);
End;
end;

[i] { Здесь, внутри цикла, ещё вызывается delete для отдельных элементов MClist, но даже если его убрать, лучше не становится... }

MClist.free;
end;

В итоге на какойто итереции вылетает OutOfMemory (повторное обращение к уже освоюождённой памяти) на строке (*****************).

Прошолся F8, оказалось, что к-тый элемент cl2 недоступен, при чём 100% НЕ ТОТ, КОТОРЫЙ КОПИРОВАЛСЯ В MClist!!! и далеко не на первой итерации, на которой это копирование происходило.

cl2 используется лишь 2 раза, где вы видите.

На MClist ничего не ссылается.

Если убрать строку MClist.Add(cl2[cntr]); , всё, естественно, работает.

Ставил create, free вне цикла, а внутри него - clear ---- опять не помогает........................... ................................... ................................... .....
novicer вне форума Ответить с цитированием
Старый 15.06.2007, 17:21   #2
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

Я уже встречался с этой проблемой, лечил созданием дубликата, по другому во всех вариациях одно и тоже, если не сразу то после 2-3 обращения. Тоисть:

Begin
e:=tobject.create;
e:=cl2[cntr];
MClist.Add(e);

End;
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 15.06.2007, 17:28   #3
novicer
 
Регистрация: 06.05.2007
Сообщений: 6
По умолчанию Пытался я так...

MContr := TContract.create;
MContr := cl2[cntr];
MClist.Add(MContr);


Тоже самое выдаёт, только чуть боьше итераций проходит...
novicer вне форума Ответить с цитированием
Старый 15.06.2007, 17:59   #4
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

попробуй присваивать не обьект (MContr := cl2[cntr]), а просто переносить данные, к примеру:
MContr.left:=cl2[cntr].left
.............
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 15.06.2007, 20:30   #5
novicer
 
Регистрация: 06.05.2007
Сообщений: 6
По умолчанию

В принципе, это возможно, но данных слишком много: несколько десятков полей, списки объектов:
cl2[cntr].name;
..........

cl2[cntr].BuildingsList <---- тоже указатель, фактичесски...
Короче, попробую. Но чувствую, и это не спасёт...
novicer вне форума Ответить с цитированием
Старый 17.06.2007, 00:21   #6
novicer
 
Регистрация: 06.05.2007
Сообщений: 6
По умолчанию

Всё пашет. Спасибо. Тему можно закрыть.
novicer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с указателями в паскале Cartman18 Помощь студентам 3 12.05.2008 09:43
Помогите пожалуйста с динамической памятью и указателями Riddick2013 Помощь студентам 1 19.12.2007 14:41
проблема с указателями =\ shad0w Общие вопросы C/C++ 9 09.12.2007 03:36