這裏提到 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
我不積極,但我認爲你的問題是使用'TBytes';您是否嘗試過'TByteArray'或'PByteArray'? – ildjarn 2011-12-31 00:29:58
lData動態數組對於您的過程是本地的。它在超出範圍時即在退出程序時自動銷燬。我仍然無法弄清楚爲什麼你會遇到異常。 – 2011-12-31 00:33:47
我已經嘗試了TByteArray和PByteArray ...同樣的問題,這讓我懷疑它是否被刪除兩次或根本沒有的void *數據?我累了的眼睛不知道這個問題的答案 – 0909EM 2011-12-31 00:54:13