2011-12-31 56 views
0

這裏提到 Delphi CopyMemory vs C++ memcpy的ByteArray在DynArrayClear

雖然我有一個滿意的答覆我原來的問題,我仍然有相同的應用程序崩潰的麻煩德爾福,我努力理解隨後的崩潰...

我有一個delphi應用程序,它使用網絡庫和服務器應用程序(它存在於工作的某個地方),它使用相同的網絡庫。網絡庫似乎正常工作是用C++(而不是我)編寫的。該庫爲我處理所有通信,所以我只需要向庫提供一個字節數組。我可以成功發送並從我的服務器接收數據 - 並且數據在兩個方向上都是正確的。

我在輔助程序中從服務器接收數據。該過程正確運行到「結束」; (毫不誇張的說)。該過程結束了(我現在成功通過所有通信,現在只關注Delphi),調試器將我帶入_DynArrayClear - 我的應用程序崩潰。從我讀的幫助中,「Delphi編譯器會在適當的時候自動插入對此函數的調用。」

我會添加一些更多的背景,如果有幫助......網絡化圖書館填充其在內容結構定義爲void *的數據的字節數組(見下文)

struct content { 
    void *data; 
    int size; 
} 

我相信所有的我需要做的,一旦這個數據填充是在德爾福執行一個CopyMemory操作...

有人能幫我理解我做錯了什麼?!

// should be: function THelper.ReceiveData: TBytes; - 
// but my crash happens with either a function or a procedure 
procedure THelper.ReceiveData; 
var 
    lMsg: Pointer; 
    lSize: Integer; 
    lData: TBytes; 
    lRecvResult: Integer; 
begin 
    lMsg := nil; 

    // Remote call to receive data returns an integer indicating success 
    lRecvResult := lib_receive_data(lMsg, Integer(Flags)); 
    TUtils.CheckError(lRecvResult); 

    SetLength(lData, 5); 
    CopyMemory(@lData[0], lMsg, 5); // where 5 is the length of data to copy 
end; // takes me into _DynArrayClear 



// The application crashes after exiting _DynArrayClear 
// For clarity @@noFinalize is entered at line 20795 
// I get all the way to the 'end;' at line 20801 in System.pas 
// 
// Then from _DynArrayClear I press F7 and immediately get access violation at 0xcdcdcdcd: read address of 0xcdcdcdcd and the following is the call stack... 

:7789fada ntdll.NtQueryInformationProcess + 0x12 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
:77890143 ntdll.KiUserExceptionDispatcher + 0xf 
:778c6a8b ; ntdll.dll 
+0

我不積極,但我認爲你的問題是使用'TBytes';您是否嘗試過'TByteArray'或'PByteArray'? – ildjarn 2011-12-31 00:29:58

+0

lData動態數組對於您的過程是本地的。它在超出範圍時即在退出程序時自動銷燬。我仍然無法弄清楚爲什麼你會遇到異常。 – 2011-12-31 00:33:47

+0

我已經嘗試了TByteArray和PByteArray ...同樣的問題,這讓我懷疑它是否被刪除兩次或根本沒有的void *數據?我累了的眼睛不知道這個問題的答案 – 0909EM 2011-12-31 00:54:13

回答

0

lRecvResult:= lib_receive_data(lMsg,整數(標誌));

lib_receive_data()的第一個參數實際聲明爲?您正在傳入本地Pointer變量,該變量初始設置爲nil,因此我假設該參數是,當lib_receive_data()退出時,會分配一些有意義的內存地址? lib_receive_data()實際輸出了什麼?

您意指content結構,但我沒有看到你在任何地方使用它。你聲明瞭一個lSize變量,但是你也不使用它。 lib_receive_data()的文檔實際上說的是什麼?

SetLength(lData,5); CopyMemory(@lData [0],lMsg,5); //其中5是要複製的數據的長度

您是否確定lMsg始終指向包含至少5個字節的緩衝區? lib_receive_data()的回報值代表什麼?它是一個字節計數,還是一個狀態碼?

您的地址爲讓這樣的錯誤0xcdcdcdcd表明你很可能踐踏TBytes內存,當TBytes被釋放,這將導致崩潰的_DynArrayClear()的事實。