关于delphi的内存管理问题

liujiboy 2003-10-21 12:33:25
在delphi中create一个类是否一定要free?比如A=TA.create();是否一定要调用A.free()?如果TA类中有一些变量申请了空间比如有一个域使用NEW申请了一段空间是否需要在重写free,并在free中使用dispose释放?一个函数返回一个类,比如function returnA():TA,使用语句A=returnA,这个A是否需要释放?如果返回的对象中含有一个域,该域用NEW申请了空间,是否也要一并释放?同时几个申请内存的函数也让人搞不懂,请帮忙解释一下。谢谢。
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrameSniper 2003-10-21
  • 打赏
  • 举报
回复
是的,DELPHI中类实例都是建立在堆上的,堆上的东西不会自动释放,所以必须手动释放,否则就会出现内存泄露!另外,你这里所说的类是否释放不是很确切,我们一般只负责对象的手动释放,至于类对应的VMT我想应该是程序负责的,开发者没有必要考虑!

如果你在构造器中为一些在堆上分配空间的变量分配了空间,那么应该重写析构器来释放相应的被开辟的空间!直接使用Free释放就可以了,对于使用New开辟的空间,肯定是要有相应的Dispose来负责释放!

这里不是返回一个类,是返回一个类型为TA的对象实例引用,既然有引用,肯定就有对应的实例,所以仍然需要释放....

既然对象释放,那么对象包含的域应该是一并就被释放了的

申请内存比较常用的就是New和GetMem两个,几乎一致,唯一区别就是GetMem可以指定开辟内存的大小
snowfog 2003-10-21
  • 打赏
  • 举报
回复
1、对象类型要用Create和Free;
2、非对象类型指针(如记录指针),要用New和Dispose;
3、函数返回值,如果是对象类型和指针类型,则必须按照上述方法在需要时手动释放;如果是其它类型则Delphi会自动释放。
另外,在使用TList时也要注意,TList不会在销毁时自动释放曾加入到列表中的指针,必须手动释放。
Tiack 2003-10-21
  • 打赏
  • 举报
回复
除楼上所说之外,还有一种是不需要写FREE的,这种是由于的Owner负责管理它,比如一可视化控件.
fhuibo 2003-10-21
  • 打赏
  • 举报
回复
gz
liujiboy 2003-10-21
  • 打赏
  • 举报
回复
delphi的函数返回的对象,是指向该对象的引用还是指向该对象的拷贝?
liujiboy 2003-10-21
  • 打赏
  • 举报
回复
delphi的函数返回的对象,是指向该对象的引用发生指向该对象的拷贝?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧