向上帝打申请了,下辈子再也不做程序员!! 上帝批复:OK!
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sende... Read More
posted @ 2009-03-15 18:52 zywuhao Views(204) Comments(0) Diggs(0)
Delphi 为我们提供了三个方便的函数: GlobalAllocPtr {简化自 API 的 GlobalAlloc} GlobalReAllocPtr {简化自 API 的 GlobalReAlloc} GlobalFreePtr {简化自 API 的 GlobalFree} 读写本程序以外的数据时可以使用它们, 很方便, 譬如: p := GlobalAllocPtr(0, Le... Read More
posted @ 2009-03-15 18:48 zywuhao Views(335) Comments(0) Diggs(0)
MoveMemory、CopyMemory 的功能是一模一样的, 都是复制内存, 都是调用 Move 过程;MoveMemory、CopyMemory 操作指针; Move 操作实体.还要注意, 它们的参数位置不一样! 举例: {例1} var buf1,buf2: array[0..9] of AnsiChar; begin buf1 := '0123456789'; buf2 := '... Read More
posted @ 2009-03-15 18:47 zywuhao Views(374) Comments(0) Diggs(0)
FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar;清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事.为了下面的测试, 先写一个以十六进制方式查看内存的函数: function GetMemBytes(var X; size: Integer): string; var pb: PByte; i: Integer; ... Read More
posted @ 2009-03-15 18:46 zywuhao Views(507) Comments(0) Diggs(0)
使用结构或结构数组, 一般是不需要主动分配内存的, 譬如: 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 ... Read More
posted @ 2009-03-15 18:45 zywuhao Views(295) Comments(0) Diggs(0)
静态数组, 在声明时就分配好内存了, 譬如: var arr1: array[0..255] of Char; arr2: array[0..255] of Integer; begin ShowMessageFmt('数组大小分别是: %d、%d', [SizeOf(arr1), SizeOf(arr2)]); {数组大小分别是: 512、1024} end; 对静态数组指针, 虽然在... Read More
posted @ 2009-03-15 18:44 zywuhao Views(286) Comments(0) Diggs(0)
本例效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: T... Read More
posted @ 2009-03-15 18:39 zywuhao Views(249) Comments(0) Diggs(0)
本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆. 效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; t... Read More
posted @ 2009-03-15 18:30 zywuhao Views(202) Comments(0) Diggs(0)
一个使用私有堆的例子: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Cli... Read More
posted @ 2009-03-15 18:27 zywuhao Views(188) Comments(0) Diggs(0)
VirtualAlloc 分配的内存是以 4K 为最小单位、连续的内存地址(但映射到真实的内存时它不一定是连续的), 前面说了, 它不适合分配小内存(譬如只有几个字节的变量); 局部的变量在 "栈" 中有程序自动管理, 那么那些全局的小变量怎么办呢? 这就要用到 "堆".这样看来, VirtualAlloc 分配的内存既不是 "栈" 也不是 "堆"; VirtualAlloc 分配的内存地址是连续... Read More
posted @ 2009-03-15 18:25 zywuhao Views(253) Comments(0) Diggs(0)
系统给程序的地址数是 4G, 为什么不是 3G 或 5G? 因为 32 位的指针的最大值就是 $FFFFFFFF, 它不能表示更多了, 究其根源这要回到 CPU 的寻址能力、地址总线等等.在 Win64 下, 系统给程序的地址数达到了 16EB(0 - $FFFFFFFFFFFFFFFF), 也就是 18446744073709551616 个. 不过 Win64 还没有普及, 我们还得回到实际的... Read More
posted @ 2009-03-15 18:24 zywuhao Views(217) Comments(0) Diggs(0)
Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序)、一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题). 对 Win32 来讲, 系统给每个进程 4GB 的地址空间:低端 2GB($00000000 - $7FFFFFFF) 给用户支配;高端 2GB($80000000 - $FFFFFFFF) 留给系统使用. 文件或程序要... Read More
posted @ 2009-03-15 18:22 zywuhao Views(263) Comments(0) Diggs(0)
马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr DisposeStr StrNew StrAlloc StrDispose GlobalAllocPtr GlobalFreePtr WideStrAlloc AnsiStrAlloc StrDi... Read More
posted @ 2009-03-15 18:14 zywuhao Views(455) Comments(0) Diggs(0)
System.AllocMem;System.AllocMemCount;System.AllocMemSize;System.Dispose;System.Finalize;System.FreeMem;System.FreeMemory;System.GetHeapStatus;System.GetMem;System.GetMemory;System.GetMemoryManager;Sys... Read More
posted @ 2009-03-15 18:12 zywuhao Views(274) Comments(0) Diggs(0)