摘要:
MoveMemory、CopyMemory 的功能是一模一样的, 都是复制内存, 都是调用 Move 过程;MoveMemory、CopyMemory 操作指针; Move 操作实体.还要注意, 它们的参数位置不一样! 举例: {例1}var buf1,buf2: array[0..9] of AnsiChar;begin buf1 := '0123456789'; buf2 := 'abcdefghij'; Move(buf2[2], buf1[4], 5); ShowMessage(buf1); {0123cdefg9} ShowMessage(buf2); 阅读全文
摘要:
马上能想到的函数有: GetMemAllocMemReallocMemFreeMemGetMemoryReallocMemoryFreeMemoryNewDisposeNewStrDisposeStrStrNewStrAllocStrDisposeGlobalAllocPtrGlobalFreePtrWideStrAllocAnsiStrAllocStrDisposeMoveMoveMemoryCopyMemoryZeroMemoryFillMemoryFillCharStrBufSize给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc 阅读全文
摘要:
静态数组, 在声明时就分配好内存了, 譬如: var arr1: array[0..255] of Char; arr2: array[0..255] of Integer;begin ShowMessageFmt('数组大小分别是: %d、%d', [SizeOf(arr1), SizeOf(arr2)]); {数组大小分别是: 512、1024}end;对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的.这种情况, 我们应该用 New 和 Dispose 来分配与释放内存. 譬如: type TArr1 = array[0..255] o 阅读全文
摘要:
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如: var pts: TPoint;begin pts.X := 1; pts.Y := 2; ShowMessageFmt('%d,%d', [pts.X, pts.Y]); {1,2}end;//结构数组:var Arr: array[0..2] of TPoint; i: Integer;begin for i := 0 to Length(Arr) - 1 do begin Arr[i].X := i; Arr[i].Y := Trunc(Sqr(i)); end; ShowMessageFmt('... 阅读全文
摘要:
FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar;清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事.为了下面的测试, 先写一个以十六进制方式查看内存的函数: function GetMemBytes(var X; size: Integer): string;var pb: PByte; i: Integer;begin pb := PByte(X); for i := 0 to size - 1 do begin Result := Result + IntToHex(pb^, 2) + #32;... 阅读全文