![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найдите, пожалуйста, ошибку в алгоритме особождения ресурсов [D6, Win2k]
Сатир © (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);
а как это цикл вообще заканчивается