Hoi
Ik heb een thread probleempje waar een memory leak in op treed.
Zodra de ProcessesToWatch array regel aanwezig is krijg ik een memory leak.
Ik heb al van alles geprobeerd om deze op te lossen maar snap niet zo goed waarom hij op treed.
Ik heb alles eruit gestript om het minimale over te houden en het te reproduceren.
Wat mis ik hier nu?
Code:
program CreateThreadTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
WinAPI.Windows,
System.SysUtils,
Winapi.TlHelp32;
type
TProcMonParamsRec = record
WatchList : TArray<string>;
end;
PProcMonParamsRec = ^TProcMonParamsRec;
var
gProcMonParamsRec : TProcMonParamsRec;
gProcMonHandle : THandle;
gProcMonThreadID : Cardinal;
gProcMonFinished : boolean;
gTemp : TArray<string>;
const
gProcessesToWatch : TArray<string> = ['notepad.exe', 'cmd.exe'];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
function DoStartProcMon(P: Pointer): Dword; STDCALL;
var
ProcessesToWatch : TArray<String>;
begin
ProcessesToWatch := PProcMonParamsRec(P)^.WatchList; // <-- MEMORY LEAK
repeat
Write ('.');
Sleep (1000);
until gProcMonFinished; // Keep thread running
result := 0;
SetLength (ProcessesToWatch, 0); // <-- werkt niet
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
function StartProcMon(aWatchList : TArray<string>) : THandle;
Begin
gProcMonParamsRec.WatchList := aWatchList;
result := CreateThread(NIL, 0, @DoStartProcMon, @gProcMonParamsRec, 0, gProcMonThreadID);
End;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\
begin
ReportMemoryLeaksOnShutDown := true;
// *** MEMORY LEAK ***
//Unexpected Memory Leak
//An unexpected memory leak has occurred. The unexpected small block leaks are:
//
//13 - 20 bytes: Unknown x 1
//21 - 28 bytes: UnicodeString x 1
//29 - 36 bytes: UnicodeString x 2
gProcMonFinished := false;
gProcMonHandle := 0;
try
try
gProcMonHandle := StartProcMon (gProcessesToWatch);
readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
CloseHandle(gProcMonHandle);
end;
// *** NO MEMORY LEAK ***
// gTemp := gProcessesToWatch;
end.
Bookmarks