Форум: "Начинающим";
Текущий архив: 2011.03.27;
Скачать: [xml.tar.bz2];
Внизосвобождение памяти под интерфейс Найти похожие ветки
← →
cross (2011-01-04 11:21) [0]вопрос: А нужно ли следить за памятью используемой интерфейсом? Вот, к примеру, метод в котором юзается интерфес 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, не фиксируются, занимаемая память вроде как освобождается. Внесите ясность.
← →
_Юрий (2011-01-04 11:59) [1]Присвоение nil"а приводит к немедленному вызову _Release (и освобождению памяти, если счетчик ссылок достиг нуля и если реализация интерфейса подразумевает автоматическое освобождение).
Если же nil не присваивать явно, тоже самое произойдет по выходу переменной из области видимости (неявный вызов _Release компилятором, и далее аналогично ).
Вот и вся разница
← →
KilkennyCat © (2011-01-04 12:00) [2]имхо, следить надо всегда.
а вообще, зависит от кучи факторов. например, от используемого менеджера памяти.
← →
cross (2011-01-04 12:47) [3]прочитал тут, что если все ссылки на интерфейс потеряны, то память выделенная под интерфейс автоматически освобождается менеджером памяти. Получается, что, чтобы не произошло мемори лика не будет, или я ошибаюсь.
← →
KilkennyCat © (2011-01-04 12:51) [4]
> память выделенная под интерфейс автоматически освобождается
> менеджером памяти
не совсем так. Она теоретически должна автоматически освобождаться. А вот практически возникают утечки.
← →
Ega23 © (2011-01-04 13:03) [5]
> то память выделенная под интерфейс автоматически освобождается
> менеджером памяти. Получается, что, чтобы не произошло мемори
> лика не будет, или я ошибаюсь.
Память не освобождается, а вызывается метод _Release
А вот что он там будет делать - это уже твоя забота. Например, вызвать Free.
← →
Ega23 © (2011-01-04 13:15) [6]
> Присвоение nil"а приводит к немедленному вызову _Release
Кстати, не факт.
← →
sniknik © (2011-01-04 13:20) [7]> что если все ссылки на интерфейс потеряны
если реально потеряны, то никакого "автоматически" не может быть. автоматически это только когда плановое закрытие, типа выхода из области видимости о чем писали. т.е. там где не ты, а компилятор то же самое обниление (релиз) сделал. вся разница, ты или компилятор. если потерять то как его искать чтобы это сделать? чудеса не программируются. даже модные сборщики мусора не помогут, т.к. они тоже работают по ссылкам, без ссылки (и ее типа) область памяти не идентифицируема (в основном).
← →
KilkennyCat © (2011-01-04 13:45) [8]На мой взгляд, это недостаток ОС. Приложения больше нет - память должна освободиться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.03.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c