關於MOVE 和 CopyMemory 的用法區別
最近做了一個數據采集服務器, 根據程序的框架,使用了大量的指針結構體(內存塊) 操作。
例子:
PArrayByte = ^TArrayByte;
TArrayByte = packed record
ABinding: Pointer;
data: TBytes;
len: integer;
IP: string[15];
Port: UINT;
end;
//數據解析函數
function GetGuiyue(ABuffer: PArrayByte): Boolean; stdcall; external ‘Guiyue.dll‘;
//數據采集函數:
function GetCommand(ABuffer: PArrayByte): Boolean;
var
P: PArrayByte;
begin
try
new(P);
//指針傳遞
Move(ABuffer,P, Sizeof(ABuffer)); //可以將數據復制到P, ABuffer 和 P 指向同一個內存區 , ABuffer = $29580D0 ,ip= ‘192.168.1.132‘,P = $29580D0
CopyMemory(P,ABuffer, Sizeof(ABuffer)); //可以將數據復制到P, ABuffer 和 P 指向同一個內存區 , ABuffer = $29580D0 ,ip= ‘192.16‘######,P = $29580D0 數據復制不全,數據塊長度不夠
執行出錯,應該是 CopyMemory(@P,@ABuffer, Sizeof(ABuffer));
//復制內存塊
Move(ABuffer,P, Sizeof(TArrayByte); //可以將數據復制到P, ABuffer 和 P 指向不同的內存區 , ABuffer = $5FFFFFF, ip= Inaccessible value, P = $29580D0
執行出錯,應該是:Move(ABuffer^,P^, Sizeof(TArrayByte);
CopyMemory(P,ABuffer, Sizeof(TArrayByte)); //可以將數據復制到P, ABuffer 和 P 指向不同的內存區 , ABuffer = $29580D0 ,ip= ‘192.168.1.132‘,P = $24680D0
PArrayByte(P)^.ip := ‘113.140.88.*‘; //數據處理
GetGuiyue(P); //數據解析
所以使用指針傳遞 復制數據 要在數據處理函數進行指針釋放 Dispose(P);
finally
Dispose(P); //使用內存塊復制數據,釋放數據源指針 $24680D0
end;
end;
//數據解析
function GetGuiyue(ABuffer: PArrayByte): Boolean; stdcall;
var
myBuffer: TBytes;
begin
try
CopyMemory(@myBuffer[0],@ABuffer^.data[0], ABuffer^.len)
.............//數據處理
except
end;
end;
http://www.cnblogs.com/wxy8/archive/2011/06/22/2086703.html
關於MOVE 和 CopyMemory 的用法區別