2010-01-13 2 views
0

다음 방법에서 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해야합니다.

편집 : 문제를 발견하고 메모리를 덮어 씁니다.

+0

첫 번째 버퍼를 FreeMeming하기 전과 후에 두 버퍼의 내용을 살펴 보셨습니까? 그들은 부패 해 보입니까? –

+0

나는 MemoryManager를 변경했고, 작성한 후에는 한 번만 삭제 된 것 같아서 친구가 제안한대로 덮어 쓰기를 시도 할 것입니다. – JPvdMerwe

답변

0

기본적으로 내가 할당 한 메모리 버퍼 끝 부분에 썼다.이 때문에 어떻게 든 EAccessError에 Free()가 발생했습니다.

두 버퍼가 모두 메모리에 인접 해 있었기 때문에 (어쩌면 4 바이트 appart 였기 때문에) 결국 두 번째 버퍼의 각 버퍼 앞에 delphi에 저장된 일부 정보를 덮어 썼다. 실제보다 더 길어서 프로그램에 속하지 않는 메모리를 사용 가능하도록 시도합니다.

0

나는 EAccessViolation을 의미한다고 가정합니다. 아마도 버퍼가 이미 해제되었거나 유효하지 않습니다. 최소한의 문맥 없이는 더 이상 말하기 어렵습니다.

+0

당신 말이 맞아요. 그리고 나는 더 많은 문맥을 추가했습니다. – JPvdMerwe

관련 문제