Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.27;
Скачать: CL | DM;

Вниз

освобождение памяти под интерфейс   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
2-1293339350
adminmax
2010-12-26 07:55
2011.03.27
ошибка при компиляции


15-1292331262
sosed47
2010-12-14 15:54
2011.03.27
Ошибка пакета компонентов


15-1292327670
12
2010-12-14 14:54
2011.03.27
именование объектов в ORACLE в БД


3-1255705719
IOrist
2009-10-16 19:08
2011.03.27
Как отобразить поля в гриде без гемора?


15-1292323166
ixen
2010-12-14 13:39
2011.03.27
Setup и Firebird