代码之家  ›  专栏  ›  技术社区  ›  JPvdMerwe

显然每一次侵犯都是由弗里曼抛出的

  •  0
  • JPvdMerwe  · 技术社区  · 15 年前

    在以下方法中,freemm()引发eacessViolation。可能的原因是什么?

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

    编辑: 据我所知,TDataset缓冲区只分配在:

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

    并且只在FreeRecordBuffer()中释放

    现在我已经检查过了,在我的示例中,分配了2个缓冲区,第一个缓冲区会在没有挂接的情况下释放,但第二个缓冲区会导致freemm()抛出eacessviolation。我还检查了(通过写下指针地址)allocrecordbuffer()给出的两个地址是否都传递给freecrecordbuffer(),其他什么都没有。

    根据 Delphi Basics freemm()只应在指针无效时引发einvalidpointer。

    编辑:发现问题了,我重写了记忆。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Uli Gerhardt    15 年前

    我想你指的是每一次侵犯。可能缓冲区已释放或无效。如果没有一点上下文,就很难说得更多。

        2
  •  0
  •   JPvdMerwe    15 年前

    基本上,所发生的是我在分配的内存缓冲区的末尾写了一段代码,这不知何故导致了free()对每个访问错误的处理。

    这可能是因为两个缓冲区在内存中都是相邻的(严格地说,它们是4个字节的Appart),并且通过在末尾写入数据,我在第二个缓冲区中的每个缓冲区之前重写了Delphi存储的一些信息,从而可能使缓冲区认为它比实际长,并导致它尝试释放不属于pr的内存。图。