|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.06.2007, 17:00 | #1 |
Регистрация: 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 ---- опять не помогает........................... ................................... ................................... ..... |
15.06.2007, 17:21 | #2 |
Форумчанин
Регистрация: 30.03.2007
Сообщений: 124
|
Я уже встречался с этой проблемой, лечил созданием дубликата, по другому во всех вариациях одно и тоже, если не сразу то после 2-3 обращения. Тоисть:
Begin e:=tobject.create; e:=cl2[cntr]; MClist.Add(e); End;
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!! |
15.06.2007, 17:28 | #3 |
Регистрация: 06.05.2007
Сообщений: 6
|
Пытался я так...
MContr := TContract.create;
MContr := cl2[cntr]; MClist.Add(MContr); Тоже самое выдаёт, только чуть боьше итераций проходит... |
15.06.2007, 17:59 | #4 |
Форумчанин
Регистрация: 30.03.2007
Сообщений: 124
|
попробуй присваивать не обьект (MContr := cl2[cntr]), а просто переносить данные, к примеру:
MContr.left:=cl2[cntr].left .............
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!! |
15.06.2007, 20:30 | #5 |
Регистрация: 06.05.2007
Сообщений: 6
|
В принципе, это возможно, но данных слишком много: несколько десятков полей, списки объектов:
cl2[cntr].name; .......... cl2[cntr].BuildingsList <---- тоже указатель, фактичесски... Короче, попробую. Но чувствую, и это не спасёт... |
17.06.2007, 00:21 | #6 |
Регистрация: 06.05.2007
Сообщений: 6
|
Всё пашет. Спасибо. Тему можно закрыть.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с указателями в паскале | Cartman18 | Помощь студентам | 3 | 12.05.2008 09:43 |
Помогите пожалуйста с динамической памятью и указателями | Riddick2013 | Помощь студентам | 1 | 19.12.2007 14:41 |
проблема с указателями =\ | shad0w | Общие вопросы C/C++ | 9 | 09.12.2007 03:36 |