动态内存分配申请:
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(…),让程序中断下来,检查并调试。
参考;这里写链接内容