Einzelnen Beitrag anzeigen

Nuclear-Ping
(Gast)

n/a Beiträge
 
#1

Pointer kann nicht freigegeben werden?

  Alt 4. Apr 2007, 15:44
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
  Mit Zitat antworten Zitat