动态数组释放问题,delphi释放内存问题
我声明全局变量动态数组 A,在释放的时候为什么要先setlength(A,0),然后freeandnil呢,不用freeannil行吗?如果不用freeandnil,会出现情况呢。
我参与的是实时监控项目,需要不断根性数据,也就是说,不断清空哈希表,然后再向里边填充数据,然后在清空。数据每1分钟更新一次,我检查了每个函数和过程,还有全局变量,该释放时候都手动释放了,尤其是局部数组和哈希表等等,我都手动释放,为什么运行一段时间后,程序占用的内存一直再涨啊?TTTTTTTT。。。。
最后我使用了网上一段代码,放到程序当中,隔一段时间运行一次,代码是
procedure TfrmMain.ClearMemory;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
application.ProcessMessages;
end;
end;
这段代码是什么意思啊,用到这段代码后,内存瞬间减少很多。但是占用内存大小并不确定,有时候我一直看着,最大不过10M,而且马上就小了。有的时候涨到20M左右,但是不会再明显增加,维持在20M。
如果去掉这段代码,我点击子窗体,然后关闭他,再点击,再关闭,内存一直在涨,关闭之后却没有明显释放内存。我没有在dpr当中创建子窗体,只是在程序中creat(nil),然后,手动在finnaly中free他。看起来,是手动创建,手动释放,但是却一直涨内存,为什么呢。。。YTTTTTTTTTTTTTTTTTTTTTTT
[解决办法]
ClearMemory 少用, 这种东西是设定私有内存工作空间的, 这段代码的意思就是说尽量把内存抽取出来给别人用, 关于内存释放, 你写的太笼统了, 不好看出来, 最好把代码贴出来, 一般不会这么写代码的
[解决办法]
这个东西不需要freeandnil的, 这个叫动态数组, 直接SetLength(glb_IndexConfig,0) 就已经释放内存了
[解决办法]
动态数组是生存期自管理的,离开了作用域他们就会被释放,所以不用手动去释放
有时候动态数组占用内存比较大时,想在离开了作用域前释放的(比如一些全局的动态数组变量),赋值为nil就行了