Delphi New,Getmem,ReallocMem联系与区别
?
转自博客园http://www.cnblogs.com/jsrgren/archive/2011/10/31/2270353.htmlprocedure New(var P: Pointer);??{为一个指针变量分配内存,会自动计算指针所指数据结构需要空的空间大小}procedure GetMem(var P: Pointer; Size: Integer);?{分配一个指定大小的内存块(连续),并用P指向它} procedure ReallocMem(var P: Pointer; Size: Integer);{重新分配指定大小内存块,参数P必须是nil或者指向一个由GetMem,AllocMem,或 ReallocMem分配的内存变量,其分配的内存是连续的,会把前面已有的数据移到新分配的内存中去} 通常采用New分配内存比较好。 ? 一、New和GetMem都可以为指针类型动态分配内存,并且Delphi不会对由此分配的内存进行管理,即必须有相应的代码对其进行释放,否则内存将“丢失”,直到应用程序结束。 ? ? ****************************************** 转自http://blog.sina.com.cn/s/blog_62fd44430100v79l.html 如果操作一个 record 指针中的字符串变量,会不会丢失 string 的内 =================================================== 哦,我上面犯错误了,以为 S = 0 时也会出错,所以没有 FillChar,其实不会。 In Delphi code,FreeMem destroys the variable referenced by P and returns its memory to the heap. If P does not point to memory in the heap,a runtime error occurs. If P points to a structure that includes long strings,variants,dynamic arrays,or interfaces,call Finalize before calling Freemem. ...... Note: It is preferable to use the New and Dispose procedures rather than GetMem and FreeMem. When using New and Dispose,there is no need to explicitly call Finalize. 这段英文我翻译一下。 “在DELPHI代码中,FreeMem根据变量所引用的指针释放内存,并将内存归还给堆。如果指针不是指向堆中的内存地址,将发生一个运行时错误。如果指针所指向的是一个数据结构,且其中包含有长字符串、Variants、动态数组、或接口,则在使用用FreeMem之前须调用Finalize ” "注意:使用New 和 Dispose 过程要强于使用GetMem与FreeMem。但我们使用New和Dispose的时候,不需要显示的调用Finalize " 翻译完了。肯定有不准确的地方。 不过我有一个问题,内存分配既然new和Dispose要比GetMem与FreeMem容易使用,那么还有没有必要使用GetMem、FreeMem,在什么情况下使用它们? =================================================== 内存分配既然new和Dispose要比GetMem与FreeMem容易使用 “容易使用”通常只能是一个相对的概念,在这里,我们讨论指向结构体的指针,在这种情况下,New/Dispose 通常是易用的。但是它们是有局限的,就是那个指针指向的空间的大小必须能够在编译期间确定,它们才知道需要分配多大的空间。对于指向结构体的指针,这个值就是结构体的大小,这当然是确定的,所以能够使用它们,并且能够带来便利。 可是还有一些情况,例如你只有一个 Pointer 类型,这是无类型指针,你把它传给 New,编译器就不知道它指向的是什么内容,也就不知道它指向的空间有多大,也就不知道需要分配多少空间,就根本不能用,更不用说易用了。 还有没有必要使用GetMem、FreeMem,在什么情况下使用它们? 当然有了,如前面提到的,相对来说,New/Dispose 操作更为高层一些,我们通常用它们来操作指向结构体的指针,即是说指针指向的内容是编译期间就已知的数据结构。而当我们需要更加低级的去操作一些内存空间的时候,比如你要自己处理字符串的时候,你的指针指向的就是只有你自己才知道或者说是你自己去进行理解的内存空间,没有编译期间的明确的数据结构与之对应。这个时候,就要用到 GetMem/FreeMem 了。 所以说,New/Dispose 的局限性实际上是很大的,或者说适用范围是很小的,而 GetMem/FreeMem 给了我们充分的自由,试用范围更广。当然,具体选用哪个,还要看实际情况而定。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |