![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
освобождение памяти под интерфейс
cross © (2011-01-04 11:21:00)вопрос: А нужно ли следить за памятью используемой интерфейсом? Вот, к примеру, метод в котором юзается интерфес IXMLDOMDocument.
procedure Tlocal_upds_analyzer.local_upds_add(APack: TZIPForge);
var
pack_hdr, Stylesheet: IXMLDOMDocument;
begin
pack_hdr := CoDOMDocument;
try
pack_hdr_load(APack, pack_hdr);
Stylesheet := CoDOMDocument.Create;
try
stylesheet_load(C_STYLESHEET_LOCAL_UPDS_ADD, Stylesheet);
try
pack_hdr.transformNode(Stylesheet);
except
raise; { TODO : }
end;
with Flocal_upds.documentElement do
appendChild(pack_hdr);
finally
Stylesheet := nil;
end;
finally
pack_hdr := nil;
end;
end;
Просмотрел полно примеров, в некоторых, по окончанию пользования интерфейсом сбрасываю его в nil, как в моем методе, в некоторых не сбрасывают. Проверял FastMM'ом, мемори лики, если не сбросить в nil, не фиксируются, занимаемая память вроде как освобождается. Внесите ясность.
KilkennyCat (2011-01-04 13:45:00) [1]На мой взгляд, это недостаток ОС. Приложения больше нет - память должна освободиться.
sniknik (2011-01-04 13:20:00) [2]> что если все ссылки на интерфейс потеряны
если реально потеряны, то никакого "автоматически" не может быть. автоматически это только когда плановое закрытие, типа выхода из области видимости о чем писали. т.е. там где не ты, а компилятор то же самое обниление (релиз) сделал. вся разница, ты или компилятор. если потерять то как его искать чтобы это сделать? чудеса не программируются. даже модные сборщики мусора не помогут, т.к. они тоже работают по ссылкам, без ссылки (и ее типа) область памяти не идентифицируема (в основном).
Ega23 (2011-01-04 13:15:00) [3]
> Присвоение nil'а приводит к немедленному вызову _Release
Кстати, не факт.
Ega23 (2011-01-04 13:03:00) [4]
> то память выделенная под интерфейс автоматически освобождается
> менеджером памяти. Получается, что, чтобы не произошло мемори
> лика не будет, или я ошибаюсь.
Память не освобождается, а вызывается метод _Release
А вот что он там будет делать - это уже твоя забота. Например, вызвать Free.
KilkennyCat (2011-01-04 12:51:00) [5]
> память выделенная под интерфейс автоматически освобождается
> менеджером памяти
не совсем так. Она теоретически должна автоматически освобождаться. А вот практически возникают утечки.
cross (2011-01-04 12:47:00) [6]прочитал тут, что если все ссылки на интерфейс потеряны, то память выделенная под интерфейс автоматически освобождается менеджером памяти. Получается, что, чтобы не произошло мемори лика не будет, или я ошибаюсь.
KilkennyCat (2011-01-04 12:00:00) [7]имхо, следить надо всегда.
а вообще, зависит от кучи факторов. например, от используемого менеджера памяти.
_Юрий (2011-01-04 11:59:00) [8]Присвоение nil'а приводит к немедленному вызову _Release (и освобождению памяти, если счетчик ссылок достиг нуля и если реализация интерфейса подразумевает автоматическое освобождение).
Если же nil не присваивать явно, тоже самое произойдет по выходу переменной из области видимости (неявный вызов _Release компилятором, и далее аналогично ).
Вот и вся разница