Hallo,
irgendwie hab ich grad Tomaten auf den Augen oder so, aber ich hab hier ein Problem was ich nicht so recht verstehe und auch nicht direkt gelöst bekomme:
Delphi-Quellcode:
procedure TQuantisScannerGIF.StartScanner (DurationMs: Cardinal = 0);
var
qBuffer: ^Byte;
a, b, ReqBytes, fh, rd: Integer;
BitArr: TBitArray;
begin
if (quantisCount = 0) or (quantisBoardReset (0) <> 0) then
begin
BreakScan := TRUE;
MessageDlg ('Could not reset LQR.', mtError, [mbOK], 0);
Exit;
end;
LocalBitsValCount[0] := 0;
LocalBitsValCount[1] := 0;
ReqBytes := round (((DurationMs / 1000) * 4096000) / 8);
GetMem (qBuffer, ReqBytes);
try
rd := quantisRead (0, Pointer (qBuffer), ReqBytes);
if (rd <> ReqBytes) then
begin
BreakScan := TRUE;
MessageDlg (Format ('Error reading LQR.' + #13#10 +
'Requested: %d' + #13#10 +
'Read: %d', [ReqBytes, rd]), mtError,
[mbOK], 0);
Exit;
end;
for a := 0 to rd - 1 do
begin
BitArr := ByteToBitArr (qBuffer^);
inc (qBuffer);
for b := 0 to 7 do
inc (LocalBitsValCount[Byte (BitArr[b])]);
end;
inc (TotalBitsValCount[0], LocalBitsValCount[0]);
inc (TotalBitsValCount[1], LocalBitsValCount[1]);
finally
FreeMem (qBuffer);
end;
end;
Ich erhalte bei "FreeMem (qBuffer);" eine Zugriffsverletzung. Kommentiere ich "inc (qBuffer);" aus, erhalte ich keine Zugriffsverletzung.
Aber warum?!? Speicher wurde reserviert, die Grenzen (0 to rd - 1) werden eingehalten und logischerweise muss der Speicher auch wieder freigegeben werden. Selbst wenn ich alles in der Schleife (for a := 0 to rd - 1 ...) auskommentiere und nur "inc (qBuffer)" drinsteht, knallts.
Kommentiere ich FreeMem aus, erhalte ich auch keine AVs mehr, aber dann erzählt mir der Leak-Report vom FastMM Romane.
Ich hab das jetzt erstmal mit einem Array of Byte gelöst, aber ich würde ich Version über Pointer schon vorziehen.
Grüße,
Mario