скопировал свой вопрос из раздела "основная" т.к. это больше сюда относится, наверное.
Ситуация такая:
При каждом последуещем запуске процедуры, количество используемой приложением памяти увеличивается (при слежении в windows task manager: немного в '+', немного в '-', но в целом стабильно растет), потом, через n-количество выполнения этой процедуры, приложение начинает очень сильно тормозить...
Опыт с memproof показал след. результаты:
после троекратного выполнения процедуры и выхода из программы лог такой
386 Live Pointer 03881F54 28
387 Critical Section 03881F58 0 InitializeCriticalSection
17551 Error 000001E7 0 VirtualAlloc(03980000,1048576,8192,4) : Attempt to access invalid addr
17552 Error 000001E7 0 VirtualAlloc(03980000,65536,8192,4) : Attempt to access invalid addres
26016 Error 000001E7 0 VirtualAlloc(048C0000,1048576,8192,4) : Attempt to access invalid addr
26017 Error 000001E7 0 VirtualAlloc(048C0000,65536,8192,4) : Attempt to access invalid addres
38791 SysString 055F004C 140564 SysAllocStringLen(,140564)
107491 SysString 06C3F3FC 140564 SysAllocStringLen(,140564)
175529 SysString 06C3FFC4 140564 SysAllocStringLen(,140564)
подозрение вызывают особенно 3 последние строчки, но ума не приложу откуда ноги растут.
в процедуре создаю следующее:
Log:=TStringList.Create;
cfProg:=TIniFile.Create('C:\...\Delphi7\Projects\config.ini');
v:=VarArrayCreate([0,0], VarVariant);
List:=TStringList.Create;
Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
m: Array of Array of String;
память от них освобождаю так:
IDoc:=nil;
VarClear(v);
cfProg.Free;
Finalize(m);
FreeAndNil(Log);
FreeAndNil(List);
заранее спасибо за любое участие
<Цитата>
--------------------------------------------------------------------------------
Правильный Вася (20.09.06 19:00)
[1] If the interface returned by CreateCOMObject is assigned to a Variant, you can release the interface by assigning the Unassigned constant to that Variant.
IDoc:=nil;
ку?
<Цитата>
--------------------------------------------------------------------------------
JohnnyRaw (20.09.06 20:30)
[2] не, чето не ку (
IDoc: IHTMLDocument2;
<Цитата>
--------------------------------------------------------------------------------
Правильный Вася (20.09.06 21:07)
[3] > m: Array of Array of String;
а вложенные очичаешь?
<Цитата>
--------------------------------------------------------------------------------
JohnnyRaw (20.09.06 21:07)
[4] вот конкретный пример кода:
uses
.....
ComObj, ActiveX;
procedure hiddenleak;
var
IDoc: IHTMLDocument2;
v: Variant;
HTML: String;
begin
HTML:=Form1.IdHttp1.Get('
http://localhost/01.html');
Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
v:=VarArrayCreate([0,0], VarVariant);
v
[0]:= MarHTML;
IDoc.write(PSafeArray(System.TVarData(v).VArray));
IDoc:=nil;
VarClear(v);
end;
выполняется с десяток циклов - плюс еще мегабайт памяти, как освобождать - absolutely no idea
<Цитата>
--------------------------------------------------------------------------------
guav © (20.09.06 21:29)
[5] > IDoc:=nil;
Это не надо, оно и само делается.
> VarClear(v);
Это тоже.
> Finalize(m);
А это вообще лучше убрать.
Может в этом и ошибка, если для явного Finalize генерируется не-вложенная финализация.
<Цитата>
--------------------------------------------------------------------------------
JohnnyRaw (20.09.06 21:48)
[6] все убрал осталось лишь:
begin
HTML:=Form1.IdHttp1.Get('
http://localhost/01.html');
Idoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
v:=VarArrayCreate([0,0], VarVariant);
v
[0]:= MarHTML;
IDoc.write(PSafeArray(System.TVarData(v).VArray));
end;
результат нулевой
после десятикратного выполнения процедуры лог от memproof такой:
404 Live Pointer 02412090 28
00000069 C:\Program Files\Borland\Delphi7\Projects\Project1.exe
00403C6E C:\Program Files\Borland\Delphi7\Projects\Project1.exe
7C816D4A RegisterWaitForInputIdle C:\WINDOWS\system32\kernel32.dll
405 Critical Section 02412094 0 InitializeCriticalSection
0042B20B C:\Program Files\Borland\Delphi7\Projects\Project1.exe
00403C6E C:\Program Files\Borland\Delphi7\Projects\Project1.exe
7C816D4A RegisterWaitForInputIdle C:\WINDOWS\system32\kernel32.dll
2379 SysString 001DDA54 140564 SysAllocStringLen(,140564)
4051 SysString 044A2704 140564 SysAllocStringLen(,140564)
7801 SysString 0445DCBC 140564 SysAllocStringLen(,140564)
9598 SysString 045B56A4 140564 SysAllocStringLen(,140564)
11248 SysString 045FA05C 140564 SysAllocStringLen(,140564)
12844 SysString 045FA05C 140564 SysAllocStringLen(,140564)
14409 SysString 051E004C 140564 SysAllocStringLen(,140564)
15961 SysString 05225A14 140564 SysAllocStringLen(,140564)
17476 SysString 0526A43C 140564 SysAllocStringLen(,140564)
19052 SysString 0526A43C 140564 SysAllocStringLen(,140564)
это что по ~140 K за один цикл утекает?
где-то такие же результаты дает наблюдение за TaskManager'ом
<Цитата>
--------------------------------------------------------------------------------
guav © (20.09.06 21:59)
[7] > System.TVarData(v).VArray
VarArrayAsPSafeArray ?