मैं स्मृति आवंटित करने के लिए AllocMem/GetMem/New routines का उपयोग करता हूं, फिर स्मृति जारी करने के लिए फ्रीमेम/निपटान दिनचर्या का उपयोग करें। लेकिन मैंने पाया (प्रक्रिया एक्सप्लोरर द्वारा) कि प्रक्रिया का स्मृति आकार कम नहीं हुआ है।मेमोरी को रिहा करने के लिए फ्रीमेम/डिस्पोजेक्ट का उपयोग क्यों करें, लेकिन कोई मेमोरी कम नहीं होती है?
यदि मैं ग्लोबलएलोक पीआरटी/हेपअलोक और ग्लोबलफ्रीपीआरटी/हेपफ्री एपीआई का उपयोग करता हूं, तो स्मृति आकार कम हो जाएगा।
type
TMyRec = record
Name: string;
TickCount: Cardinal;
Buf: array[0..1024 - 1] of byte;
end;
PMyRec = ^TMyRec;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormDestroy(Sender: TObject);
begin
FList.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
ReportMemoryLeaksOnShutdown := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Size: Integer;
Rec: PMyRec;
Heap: Cardinal;
begin
Size := SizeOf(TMyRec);
Heap := GetProcessHeap;
for I := 0 to 2000 - 1 do
begin
Rec := AllocMem(Size); // Delphi routine
//GetMem(Rec, Size); // Delphi routine
//New(Rec); // Delphi routine
//Rec := GlobalAllocPtr(GPTR, Size); // Windows API
//Rec := HeapAlloc(Heap, HEAP_ZERO_MEMORY, Size); // Windows API
FList.Add(Rec);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
Size: Integer;
Rec: PMyRec;
Heap: Cardinal;
begin
Size := SizeOf(TMyRec);
Heap := GetProcessHeap;
for i := FList.Count - 1 downto 0 do
begin
Rec := PMyRec(FList.Items[i]);
FreeMem(Rec, Size); // Delphi routine
//Dispose(Rec); // Delphi routine
//GlobalFreePtr(Rec); // Windows API
//HeapFree(Heap, 0, Rec); // Windows API
end;
FList.Clear;
end;
यह एक अच्छा प्रश्न (टीएम) है। समुदाय विकी होना चाहिए। –