Delphi 动态内存管理

动态内存分配申请:
size 大小;P pchar型的指针

//在堆上申请一个size大小的内存并初始化内存, 返回地址
function AllocMem(Size: Cardinal): Pointer;

//申请一个size大小的内存并未初始化,需配字节填充 返回地址
function GetMemory(Size: Integer): Pointer; cdecl;
procedure FreeMemory(P: Pointer);
fillchar(p^,Size: Integer,char(0)) ; //数据填充

//申请一个size大小的内存并未初始化,需配字节填充 返回地址
procedure GetMem(var P: Pointer; Size: Integer);
procedure FreeMem(P: Pointer);
fillchar(p^,Size: Integer,char(0)) ; //数据填充

New(p:Pointer) ; //申请内存
Dispose(p:Pointer) ;//释放内存

一、new/dispose
New:适用场景一般都是为record/object此类数据进行分配和释放内存块,之后进行对象的初始化操作initialize(x);
initialize函数,在system单元,该函数说白了,即对record/object里面中,含有string,interface, dync array,variant,record,array的字段,进行初始化为0(清空).
Dispose
与之相反的Dispose()亦同,反操作,进行清空:finalize(x)后,再进行FreeMem,以保证record/object中,
二、GetMem/FreeMem
GetMem/FreeMem是MM的分配与释放内存块函数,多说一些是与之相关的:此两函数,会因为分配或释放失败而抛出异常(exception)
而MM对应的标准分配与释放函数是以返回值形态进行处理的,即失败了,只会返回空值(nil)或非0,而不是异常。
也就是说Get/FreeMem是针对于MM的标准函数进行了异常封装。
异常信息:
GetMem fail => Out of memory.
分配失败,一般只会是进程的可用内存分配完毕,通常在内存泄露的情况下才会发生。
FreeMem fail => Invalid pointer operation
两次FreeMem同地址,第二次就有这invalid pointer异常了。
三、GetMemory/FreeMemory
Get/FreeMemory与GetMem/FreeMem基本相同,唯一不相同的是,它直接以MM的对应函数的返回值作为返回,而不进行异常处理。
即:GetMem调用MM.GetMem返回为nil,则有异常,而GetMemory则直接返回nil,交给调用者处理
FreeMem调用MM.FreeMem返回非0(错误释放),则异常,而FreeMemory则直接返回0或非0,给调用者处理。
这点非常有用,在写程序时,可以减少异常,或者在Get/Free出现错误时,写句assert(…),让程序中断下来,检查并调试。

参考;这里写链接内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值