随笔分类 -  Delphi 内存与指针

获取打开的记事本中的内容 - 回复 "ymg1103" 的问题
摘要:问题来源: http://www.cnblogs.com/del/archive/2008/11/15/1334237.html#1784570 阅读全文
posted @ 2010-03-23 10:44 万一 阅读(4718) 评论(13) 推荐(1) 编辑
查看内存数据的函数
摘要:重写: 阅读全文
posted @ 2009-05-13 23:53 万一 阅读(7917) 评论(12) 推荐(0) 编辑
Delphi 的内存操作函数(6): 跨进程的内存分配
摘要:Delphi 为我们提供了三个方便的函数: GlobalAllocPtr {简化自 API 的 GlobalAlloc} GlobalReAllocPtr {简化自 API 的 GlobalReAlloc} GlobalFreePtr {简化自 API 的 GlobalFree} 读写本程序以外的数据时可以使用它们, 很方便, 譬如: p := GlobalAllocPtr(0... 阅读全文
posted @ 2008-11-15 18:50 万一 阅读(8450) 评论(4) 推荐(1) 编辑
Delphi 的内存操作函数(5): 复制内存
摘要: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); {abcd 阅读全文
posted @ 2008-11-14 12:59 万一 阅读(20803) 评论(9) 推荐(0) 编辑
Delphi 的内存操作函数(4): 清空与填充内存
摘要:FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar; 清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事. 为了下面的测试, 先写一个以十六进制方式查看内存的函数: function GetMemBytes(var X; size: Integer): string; var pb: PByte; i: I... 阅读全文
posted @ 2008-11-14 11:44 万一 阅读(15881) 评论(5) 推荐(0) 编辑
Delphi 的内存操作函数(3): 给结构体指针分配内存
摘要:使用结构或结构数组, 一般是不需要主动分配内存的, 譬如: 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... 阅读全文
posted @ 2008-11-10 14:50 万一 阅读(10692) 评论(6) 推荐(0) 编辑
Delphi 的内存操作函数(2): 给数组指针分配内存
摘要:静态数组, 在声明时就分配好内存了, 譬如: var arr1: array[0..255] of Char; arr2: array[0..255] of Integer; begin ShowMessageFmt('数组大小分别是: %d、%d', [SizeOf(arr1), SizeOf(arr2)]); {数组大小分别是: 512、1024} end; 对静态... 阅读全文
posted @ 2008-11-10 11:04 万一 阅读(13943) 评论(15) 推荐(1) 编辑
Delphi 的内存操作函数(1): 给字符指针分配内存
摘要:马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr DisposeStr StrNew StrAlloc StrDispose GlobalAllocPtr GlobalFreePtr WideStrAlloc AnsiStrAlloc ... 阅读全文
posted @ 2008-11-08 12:14 万一 阅读(21894) 评论(12) 推荐(2) 编辑
内存管理[6]
摘要:本例效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2:... 阅读全文
posted @ 2008-05-13 16:57 万一 阅读(6518) 评论(15) 推荐(1) 编辑
内存管理[5]
摘要:本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆. 效果图: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtr... 阅读全文
posted @ 2008-05-09 19:12 万一 阅读(5723) 评论(15) 推荐(2) 编辑
内存管理[4]
摘要:一个使用私有堆的例子: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; proc... 阅读全文
posted @ 2008-05-09 15:22 万一 阅读(6551) 评论(19) 推荐(1) 编辑
内存管理[3]
摘要:VirtualAlloc 分配的内存是以 4K 为最小单位、连续的内存地址(但映射到真实的内存时它不一定是连续的), 前面说了, 它不适合分配小内存(譬如只有几个字节的变量); 局部的变量在 "栈" 中有程序自动管理, 那么那些全局的小变量怎么办呢? 这就要用到 "堆". 这样看来, VirtualAlloc 分配的内存既不是 "栈" 也不是 "堆"; VirtualAlloc 分配的内存地址是... 阅读全文
posted @ 2008-05-08 17:22 万一 阅读(7720) 评论(7) 推荐(1) 编辑
内存管理[2]
摘要:系统给程序的地址数是 4G, 为什么不是 3G 或 5G? 因为 32 位的指针的最大值就是 $FFFFFFFF, 它不能表示更多了, 究其根源这要回到 CPU 的寻址能力、地址总线等等.在 Win64 下, 系统给程序的地址数达到了 16EB(0 - $FFFFFFFFFFFFFFFF), 也就是 18446744073709551616 个. 不过 Win64 还没有普及, 我们还得回到实际的... 阅读全文
posted @ 2008-05-06 15:11 万一 阅读(8640) 评论(12) 推荐(0) 编辑
内存管理[1]
摘要:Windows 是多任务的操作系统, 一个任务就是一个应用(应用程序)、一个应用占一个进程; 在一个进程里面, 又可以运行多个线程(所以就有了很多"多线程编程"的话题).对 Win32 来讲, 系统给每个进程 4GB 的地址空间:低端 2GB($00000000 - $7FFFFFFF) 给用户支配;高端 2GB($80000000 - $FFFFFFFF) 留给系统使用.文件或程序要调入内存才能... 阅读全文
posted @ 2008-05-06 12:00 万一 阅读(12957) 评论(14) 推荐(2) 编辑
开始学习内存管理
摘要:这是可能需要的函数: System.AllocMem; System.AllocMemCount; System.AllocMemSize; System.Dispose; System.Finalize; System.FreeMem; System.FreeMemory; System.GetHeapStatus; System.GetMem; System.GetMemory; Syste... 阅读全文
posted @ 2008-05-04 13:06 万一 阅读(10717) 评论(0) 推荐(0) 编辑