首页 > 代码库 > delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同

我估摸着内存分配+释放是个基础函数,有些人可能没注意此类函数或细究,但我觉得还是弄明白的好。

 

一:New/Dispose

     此两函数,估计学delphi/pascal,就知道:为record/object此类数据进行分配和释放内存块

     然后分配与释放是调用的是GetMem/FreeMem函数,与GetMem/FreeMem不同之处是

     New()在GetMem后,进行了initialize(x)操作,即对record/object的数据进行初始化的操作

     initialize函数,在system单元,该函数说白了,即对record/object里面中,含有string(ansi/unicode), 

     interface及动态数组(DyncArray)的字段,进行初始化为0(清空),这一步很重要,因为GetMem返回的内存块可能重复使用过的,

     使用过的,表示有值,那对应的string/interface及数组在有值的时候,表示可以操作,一操作,却是非法地址,那么AV了。

     (不要想着,在GetMem后,进行每字段初始化,容易出错的就是这个,在有以上以字段的情况下,

      如果需要手动初始化,必须用fillchar,原因如上。)

     与之相反的Dispose()亦同,反操作,进行清空:finalize(x)后,再进行FreeMem,以保证record/object中,

     string,interface/dyncarray字段,不会因为直接调用FreeMem而泄露(leak)

 

     总结是:record/object的指针类型,最好使用此对函数进行分配及释放。当然你也可以去自维护record/object里面的字段生存期。

 

二:GetMem/FreeMem

     GetMem/FreeMem是MM的分配与释放内存块函数,多说一些是与之相关的:此两函数,会因为分配或释放失败而抛出异常(exception)

     而MM对应的标准分配与释放函数是以返回值形态进行处理的,即失败了,只会返回空值(nil)或非0,而不是异常。

     也就是说Get/FreeMem是针对于MM的标准函数进行了异常封装。

 

三:GetMemory/FreeMemory

      Get/FreeMemory与GetMem/FreeMem基本相同,唯一不相同的是,它直接以MM的对应函数的返回值作为返回,而不进行其它处理。

 

四:SysGetMem/SysFreeMem

      SysGetMem/SysFreeMem与GetMemory/FreeMemory基本相同,区别在于,它直接调用MM的实现函数,

      则不是经过MM的管理器指针再行跳转。

      即说:SysGet/SysFreeMem,它使用的是系统自带的MM分配释放函数,当第三方MM加入后,以上三对函数,

      都会由第三方MM接管,但SysGet/SysFreeMem它还是调用的本系统自带的MM函数处理,与第三方MM无关。

 

五:其它

      其它还有些Delphi单元的分配释放函数,不过基本是从以上四对函数扩展出来,就不说明了

      当然也有从API扩展出来的分配+释放函数,则不在此列,它与D系统的MM扩展无关。

 

总结:

    New+Dispose与GetMem+FreeMem,是基于VCL异常机制保护的分配+释放函数。

    GetMemory+FreeMemory与SysGetMem+SysFreeMem是由调用者自行控制返回,来决定是否返回异常或错误处理。

    总结少了点,以后想到再加。瓜瓜。

 

完,可能有遗漏,不过大概如此。

2014.10.16 by qsl

delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同