显然,FreeMem会抛出EAccessViolation

时间:2010-01-13 08:07:49

标签: delphi exception

在以下方法中,FreeMem()抛出EAccessViolation。可能的原因是什么?

procedure TCustomDataset.FreeRecordBuffer(var Buffer: PChar);
begin
  FreeMem(Buffer);
end;

编辑: 据我所知,TDataset缓冲区仅分配在:<​​/ p>

function TCustomDataset.AllocRecordBuffer: PChar;
begin
    Result := AllocMem(GetBufferSize);
end;

并且仅在FreeRecordBuffer()

中释放

现在我已经检查了,在我的情况下,分配了2个缓冲区,第一个缓冲区被释放,但第二个导致FreeMem()抛出EAccessViolation。我还检查(通过写下指针地址)AllocRecordBuffer()给出的地址都传递给FreeRecordBuffer()而没有别的。

根据Delphi Basics FreeMem()只应在指针无效时抛出一个EInvalidPointer。

编辑:发现问题,我覆盖了内存。

2 个答案:

答案 0 :(得分:0)

我认为你的意思是EAccessViolation。可能缓冲区已被释放或无效。没有至少一点上下文就很难说更多。

答案 1 :(得分:0)

基本上发生的事情是我在我分配的内存缓冲区的末尾写的,这不知何故导致Free()到EAccessError。

这可能是因为两个缓冲区在内存中相邻(扼杀它们是4个字节的appart)并且通过写入结束我在第二个缓冲区中的每个缓冲区之前覆盖了delphi存储的一些信息,从而可能使缓冲区认为它更长而不是它实际上并导致它尝试释放不属于该程序的内存。