2010-01-13 50 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。

編輯:發現問題,我覆蓋了內存。

+0

你有沒有看過FreeMem'ing第一個之前和之後的兩個緩衝區的內容?他們看起來腐敗嗎? –

+0

我會檢查,我已經改變了MemoryManager,它看起來像創建後,它只被刪除一次,所以如朋友建議我會嘗試尋找覆蓋。 – JPvdMerwe

回答

0

基本上發生了什麼事是我寫了超過我分配的內存緩衝區的末尾,這導致Free()到EAccessError。

這可能是因爲兩個緩衝區都在內存中相鄰(通常是4字節的應用程序),並且通過寫入結束,我重寫了第二緩衝區中每個緩衝區之前由delphi存儲的一些信息,從而可能使緩衝區認爲它是比實際時間長,導致它嘗試釋放不屬於該程序的內存。

0

我假設你的意思是EAccessViolation。可能緩衝區已被釋放或以其他方式無效。沒有至少一點背景,很難說更多。

+0

你是對的,我添加了更多的上下文。 – JPvdMerwe

相關問題