关于对象释放后的内存问题(100)

  • 主题发起人 主题发起人 xxhadsg
  • 开始时间 开始时间
X

xxhadsg

Unregistered / Unconfirmed
GUEST, unregistred user!
以前不太注意对象释放后的内存问题,今天做了个测试,发现问题,不知道是怎么回事。首先定义一个简单的类:TMyClass=class(TObject) private s:String; end;然后在程序中创建该类的实例并赋值:aClass:=TMyClass.Create;aClass.s:=aStr;aStr初始化为一段字符,我在窗体创建时用循环生成一个比较大的字符串,主要为了增加内存消耗:for I := 0 to 1000000 - 1 do aStr:=aStr+'*';程序中创建了aClass后故意没有释放,反复创建对象,在windows任务管理器中会看到程序占用的内存反复地在增长。因为对象没有释放嘛,正常。好,接下来做个释放的测试:try aClass:=TMyClass.Create; aClass.s:=aStr; finally aClass.Free; end;然后反复执行这个操作,在windows任务管理器中会看到程序占用的内存反复地在增长,发现内存一样没有得到释放!是什么问题?请大侠指点指点!
 
这样定义应该OKs:string[strlen]这个是delphi的MemoryManager没去释放吧似乎在工程第一个UNIT加上FastMM就OK了
 
个人的意见,我觉得你的对象是释放掉了,对象是分配在堆中,那个字符串变量时分在栈中,应该需要自己清空吧,好像是那个变量没有随对象的释放而释放。要不就在类中写个函数,当类释放的时候调用函数,清空变量。
 
FastMM 是什么东东
 
to:lht123fastmm是开源内存管理,Delphi从 2007后就使用了。(使用FastMM了)没弄明白,我换了个测试:TMyClass=class(TObject) private s:array[0..10000000] of Char; end;这样这个对象在创建的时候就会占用一定的内存,然后反复执行:try b:=TMyClass.Create; finally b.Free; end;在windows任务管理器中会看到程序占用的内存反复地在增长。
 
free以后内存不一定马上就降下来,这是delphi为了防止反复找windows申请内存从资源管理器里看到内存占用升高不一定表示没释放,有可能是空占用想确定是否释放了内存,可以考虑找个检测内存泄露的东西来查查,比如CheckMem
 
如下就可以了 try b:=TMyClass.Create; finally //b.Free; 改成 FreeAndNil(); end;
 
to:eloveme我测试了,也不行。
 
aClass,aStr都是只是引用,存在于栈中,他们的指向的数据都在堆中,如果aClass.Free了,内存是不会增加的,“aStr初始化为一段字符,我在窗体创建时用循环生成一个比较大的字符串,主要为了增加内存消耗”这样内存是不会一直增加的,就算你每次创建了aClass,不过是增加了这个字符串的引用次数,但字符串只有一份,并没有COPY。除非你Create时初始化aStr,然后不Free对象,内存才会只增补减。
 
在程序退出时没有提示内存泄露,可在运行过程中仿佛创建对象并释放,在windows任务管理器中会发现内存一直在增长。像这样一个对象:TMyClass=class(TObject) private s:array[0..10000000] of Char; end;每执行一次就会占用一定内存,释放,但没有内存泄露。如果要创建很多这样的对象,内存就会消耗尽。
 
结贴,谢谢
 
后退
顶部