Zbadałem swoje "dzieło" pod kątem wycieków za pomocą FastMM4 (wersja 4.992) i okazuje się, że mam malutki wycieczek, którego nie rozumiem, więc pozwolę sobie dopytać.
Wyciek powstaje w momencie nadpisania Application.Handle w wywoływanej DLL żeby powiązać ją z aplikacją-matką, ale po kolei, przedstawię pacjentów.
DLL:
library Project1DLL;
uses
FastMM4, SysUtils, Classes, Windows, Forms;
var LocalH :THandle; {wiem, że globalna zmienna to zło ale tu nie przeszkadza}
{$R *.res}
function LeakTest(AHandle:THandle):Integer; StdCall;
begin
LocalH := Application.Handle;
Application.Handle := AHandle; {<- to przypisanie generuje późniejszy wyciek, bez niego wszystko jest ok}
end;
procedure DLLDetach(reason: Integer);
begin
if reason = DLL_PROCESS_DETACH then Application.Handle := LocalH;
end;
exports
LeakTest;
begin
DllProc := DLLDetach;
end.
Aplikacja:
Daruję sobie wszystkie zbędne nagłówki, na starcie też jest FastMM:
function LeakTest(AHandle:THandle):Integer; StdCall; external 'Project1DLL.dll' name 'LeakTest';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
LeakTest(Application.Handle);
end;
Czyli w zasadzie bez cudów.
Po kliknięciu buttona i zamknięciu aplikacji dostaję taką informację:
5-12 bajtów: Nieznany x 1
oraz w pliku z raportem:
Wyciekł blok pamięci. Rozmiar wynosi: 12
This block was allocated by thread 0x27A8, and the stack trace (return addresses) at the time was:
402D38
451C1A
451602
41F8A6
7745EEBB [Unknown function at AddClipboardFormatListener]
77455E7A [Unknown function at GetClassLongW]
77A807F6 [RtlRegisterSecureMemoryCacheCallback]
77455C8E [Unknown function at GetClassLongW]
779E3D46 [Unknown function at RtlGetCurrentServiceSessionId]
77455259 [Unknown function at GetSystemMetricsForDpi]
764A5ACC [NtUserReleaseDC]
Blok jest aktualnie używany w obiekcie klasy: Nieznany
Jest ilość alokacji : 395
Co robię źle? A może to FastMM4 wprowadza w błąd?