解释下GetMem是怎么用的,什么情况用 百度了一下还是了解,有没通俗点的解释下这个是拿来干嘛的,我知道他是分配内存的,什么时候该拿他来分配? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要时用,不要为用而用。例如:procedure Test;var p: Pointer;begin GetMem(p, 100 * 1024 *1024);//分配100MB DoSomething(p); FreeMem(p); //释放内存,如果不释放就会导致内存被遗弃(通常的现象叫做内存泄露)end;在很多时候可以用如下的替代方案:procedure Test;var b: array of byte;begin SetLength(b, 100 * 1024 *1024);//分配100MB DoSomething(@b[0]); SetLength(b, 0); //释放内存,如果这个忘记了也没有关系,这个过程(Test)执行完之后会自动被释放end; var buffer: PChar; buffer2: array[0..99] of char;begin //分配堆上的内存,好处是可以控制何时释放掉内存 GetMem(buffer, 100); try GetWindowsDirectory(buffer, 100); ShowMessage(buffer); finally FreeMem(buffer); end; //分配栈上的内存,函数结束时自动释放 GetWindowsDirectory(buffer2, 100); ShowMessage(buffer2);end; 还有对于记录指针,最好用New和Dispose来代替GetMem和FreeMem。比如:type PRec = ^TRec; TRec = record S: string; I: Integer; end;使用:var P: PRec;begin New(P); try P^.S := 'abc'; finally Dispose(P);//如果换做GetMem和FreeMem的话,S所占的内存不会被释放。 endend; 有点我没搞明白,为什么Delphi要用自己的内存管理机制,而不是用Windows的堆如果说这是为了跨操作系统开发那我信服,针对Windows的版本至少应该用Windows的堆吧,难道它觉得比Heapxxx效率高? 关于堆,我也有疑问。TList.Delete里调用了Move,而FList指向的不是不连续的内存吗,怎么可以还调Move? 看了一下delphi2007的getmem.inc,发现Delphi其实用的是虚拟内存操作函数VirtualAlloc等,而不是堆操作函数Heapxxx。《Windows核心编程》中指出:并且:可能虚拟内存操作比堆更灵活吧所以Delphi的堆只不过是操作虚拟内存罢了,地址是连续的——所以TList.Delete里调用了Move。 蒙了,跟是不是操作虚拟内存没关系,堆的内存地址对我们来说都是连续的,所以TList.Delete里调用了Move。 谁告诉你 TList 指向的内存不连续的?不用操作系统的内存管理器是效率问题,winapi 提供的只是“能用”的程度,离“效率高”差远了。 To s11ss:VirtualAlloc分配的不是虚拟内存,虚拟内存不被分配,而由操作系统管理,通过对物理分页内存(非分页内存不可交换)与虚拟内存之间的数据交换来增加运行时的可用内存空间。正如资料展示的那样VirtualAlloc对内存的管理是相当灵活的,通过各参数的配对使用除了可以完成常规的内存管理,还可以完成超大内存的管理,例如AWE(须AWE类API配合使用)。 抽空测了一下,娘的,真不是一个级别的,HeapAlloc的速度就是蜗牛,这有点搞不懂M$在干啥吃了。偏见偏见,3Q RzGroupBar动态创建,每个Item的事件要如何解决 提高代码的复用性 向大家推荐好东东:数据库结构文档生成器 如果只得到任务栏窗口的标题! 请问怎么限制Tedit控件的输入啊 四舍五入,保存小数点后三位的函数是什么? 请问:如何纵向合并单元格?在线等待... 有保存类型文件的高手请进,高分对待!!! delphi客户端有没对应ASP.NET的HTTPContext的 请问 网上寻呼,手机短消息 到底用delphi怎样实现? Delphi DBGrid 怎样实现点击排序? 我想知道delphi组件面板中所有ado,bde,data controls,dbexpress等数据库相关组件
procedure Test;
var
p: Pointer;
begin
GetMem(p, 100 * 1024 *1024);//分配100MB
DoSomething(p);
FreeMem(p); //释放内存,如果不释放就会导致内存被遗弃(通常的现象叫做内存泄露)
end;在很多时候可以用如下的替代方案:
procedure Test;
var
b: array of byte;
begin
SetLength(b, 100 * 1024 *1024);//分配100MB
DoSomething(@b[0]);
SetLength(b, 0); //释放内存,如果这个忘记了也没有关系,这个过程(Test)执行完之后会自动被释放
end;
buffer: PChar;
buffer2: array[0..99] of char;
begin
//分配堆上的内存,好处是可以控制何时释放掉内存
GetMem(buffer, 100);
try
GetWindowsDirectory(buffer, 100);
ShowMessage(buffer);
finally
FreeMem(buffer);
end; //分配栈上的内存,函数结束时自动释放
GetWindowsDirectory(buffer2, 100);
ShowMessage(buffer2);
end;
type
PRec = ^TRec;
TRec = record
S: string;
I: Integer;
end;使用:
var
P: PRec;
begin
New(P);
try
P^.S := 'abc';
finally
Dispose(P);//如果换做GetMem和FreeMem的话,S所占的内存不会被释放。
end
end;
如果说这是为了跨操作系统开发那我信服,
针对Windows的版本至少应该用Windows的堆吧,难道它觉得比Heapxxx效率高?
TList.Delete里调用了Move,而FList指向的不是不连续的内存吗,怎么可以还调Move?
并且:
可能虚拟内存操作比堆更灵活吧所以Delphi的堆只不过是操作虚拟内存罢了,地址是连续的——所以TList.Delete里调用了Move。
不用操作系统的内存管理器是效率问题,winapi 提供的只是“能用”的程度,离“效率高”差远了。
VirtualAlloc分配的不是虚拟内存,虚拟内存不被分配,而由操作系统管理,通过对物理分页内存(非分页内存不可交换)与虚拟内存之间的数据交换来增加运行时的可用内存空间。正如资料展示的那样VirtualAlloc对内存的管理是相当灵活的,通过各参数的配对使用除了可以完成常规的内存管理,还可以完成超大内存的管理,例如AWE(须AWE类API配合使用)。
抽空测了一下,娘的,真不是一个级别的,HeapAlloc的速度就是蜗牛,这有点搞不懂M$在干啥吃了。偏见偏见,3Q