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

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

Найдите, пожалуйста, ошибку в алгоритме особождения ресурсов [D6, Win2k]


Страницы:   1 2

Сатир ©   (2002-11-06 19:24:00) 

есть такой конструктор и деструктор
constructor TColorMap.Create(AOwner: TComponent);
begin
inherited;
fColors := TSClrCollection.Create(Self);
fChilds := TList.Create;
end;

destructor TColorMap.Destroy;
begin
fUpdating := True;
ClearChilds;
fColors.Free;
fChilds.Free;
Base := nil;
inherited;
end;

деструктор вызывает ClearChilds, которая определена следующим образом:

procedure TColorMap.ClearChilds;
var C: TObject;
begin
while fChilds.Count>0 do
begin
C := TObject(fChilds.Last);
if C is TColorMap then TColorMap(C).Base := nil
else if C is TStyleColors then
TStyleColors(C).Map := nil;
end;
end;

При удалении объекта из форму путём нажатия клавиши Del присходит какая-то дикая ошибка в rtl60.bpl, которая влечет за собой кучу других страшных ошибок, вплоть до того, что невозможно даже сохранить текущий проект и вийди из IDE без Access violation.
Но когда я ремарю в деструкторе ClearChilds, всё работает нормально. Возникает подозрение, а не происходит ли где утечка памяти из-за не вызова последней?

ЗЫ. исходный код не мой


Андрей Прокофьев   (2002-11-06 20:11:00) [21]

2 Сатир © (06.11.02 20:06)
>> кстати, а этот цикл, случайно, не сконца нужно проходить?
Не нужно, так как элементы списка не удаляются, а уничтожаются сами объекты, на которые ссылаются элементы списка.
А сам список чистится в List.Clear;

2 Сатир © (06.11.02 20:03)
UpdateColors(0);
CompileColors;
там fBase не участвует?


Сатир   (2002-11-06 20:06:00) [22]

2Андрей Прокофьев © (06.11.02 20:00)
>for i:= 0 to fChilds.Count - 1 do
кстати, а этот цикл, случайно, не сконца нужно проходить?
то есть
For i:= fChilds.Count - 1 downto 0 do?


Сатир   (2002-11-06 20:03:00) [23]

2Андрей Прокофьев © (06.11.02 19:53)
procedure TColorMap.SetBase(const Value: TColorMap);
begin
// if Value.Base = self then Exit;
if (fBase <> Value) and (Value<>Self) then
begin
if fBase<>nil then fBase.fChilds.Remove(Self);
fBase := Value;
if fBase<>nil then fBase.fChilds.Add(Self);
UpdateColors(0);
end;
end;

procedure TStyleColors.SetMap(const Value: TColorMap);
begin
if fMap <> Value then
begin
if fMap<>nil then fMap.fChilds.Remove(Self);
fMap := Value;
if fMap<>nil then fMap.fChilds.Add(Self);
CompileColors;
end;
end;

ЗЫ. но тем не менее, ведь условие fChilds.Count>0 не изменяется?


Андрей Прокофьев   (2002-11-06 20:00:00) [24]

procedure TColorMap.ClearChilds;
var C: TObject;
i : Integer
begin

for i:= 0 to fChilds.Count - 1 do
begin
C := TObject(fChilds.Items[i]);
//Это по-моему особенно не нужно
{
if C is TColorMap then TColorMap(C).Base := nil
else if C is TStyleColors then
TStyleColors(C).Map := nil;
}

C.Free;
end;
fChilds.Clear;
end;


Андрей Прокофьев   (2002-11-06 20:00:00) [25]

procedure TColorMap.ClearChilds;
var C: TObject;
i : Integer
begin

for i:= 0 to fChilds.Count - 1 do
begin
C := TObject(fChilds.Last);

//Это по-моему особенно не нужно
{
if C is TColorMap then TColorMap(C).Base := nil
else if C is TStyleColors then
TStyleColors(C).Map := nil;
}

C.Free;
end;
fChilds.Clear;
end;


Андрей Прокофьев   (2002-11-06 19:53:00) [26]

ClearChilds вообще ничего не удаляет, а только бесконечно чистит ссылки на другие объекты у последненго элемента списка.Значит надо смотреть TColorMap.SetBase и TStyleColor.SetMap
Что там происходит при Value равной nil.


Сатир   (2002-11-06 19:50:00) [27]

2Андрей Прокофьев © (06.11.02 19:31)
действительно, а как лучше всего в данном случае уменьшить число объектов в этом списке?


oomneeq   (2002-11-06 19:39:00) [28]

ClearChilds как он написан, ничего не освобождает, если .Base и .Map не какие-нибудь интерфейсные, а просто объектные свойства, то посадка их на nil в смысле освобождения памяти ничего не дает.
Похоже, что вызывать необязательно.

теоретически, правда влияние может быть косвенным:
(где нибудь в каком-нибудь деструкторе какая-нибудь память освобождается условно, в зависимости от того nil или not nil эти самые .Base и .Map) ну очень теоретически..


Alex4444444444   (2002-11-06 19:36:00) [29]


for I := 0 to fChildren.Count - 1 dobegin
...
TObject(fChildren[I]).Free;
end;



Андрей Прокофьев   (2002-11-06 19:31:00) [30]

while fChilds.Count>0 do
begin
C := TObject(fChilds.Last);


а как это цикл вообще заканчивается


Страницы:   1 2

Наверх

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