다음 방법에서 FreeMem()은 EAccessViolation을 발생시킵니다. 가능한 이유는 무엇입니까?FreeMem에 의해 EAccessViolation이 발생했습니다.
procedure TCustomDataset.FreeRecordBuffer(var Buffer: PChar);
begin
FreeMem(Buffer);
end;
편집 : 지금까지 내가 TDataSet의 버퍼 만에 할당 이해 :
function TCustomDataset.AllocRecordBuffer: PChar;
begin
Result := AllocMem(GetBufferSize);
end;
만 FreeRecordBuffer()
지금 내가 확인한와 내 경우 2 해제 버퍼가 할당되고 첫 번째 버퍼가 문제없이 해제되지만 두 번째 버퍼는 FreeMem()이 EAccessViolation을 발생시킵니다. 또한 AllocRecordBuffer()가 제공 한 주소가 FreeRecordBuffer()와 다른 것으로 전달되었는지 확인합니다 (포인터 주소를 적어서).
Delphi Basics에 따르면 FreeMem()은 포인터가 유효하지 않은 경우에만 EInvalidPointer를 throw해야합니다.
편집 : 문제를 발견하고 메모리를 덮어 씁니다.
첫 번째 버퍼를 FreeMeming하기 전과 후에 두 버퍼의 내용을 살펴 보셨습니까? 그들은 부패 해 보입니까? –
나는 MemoryManager를 변경했고, 작성한 후에는 한 번만 삭제 된 것 같아서 친구가 제안한대로 덮어 쓰기를 시도 할 것입니다. – JPvdMerwe