VarArrayCreate的释放内存问题?
我用VarArrayCreate不停地创建字节类型数组,开始程序才占用2-3M内存,然后程序运行一段长时间后,程序就占用了20多M内存,请问怎样释放VarArrayCreate创建的东西呢?
下面是我的程序:(是一个控件接收到串口数据后的处理,当我不停地接收时候,过了一段足够长时间程序就占用好多内存)
procedure TFMain.MSComm1Comm(Sender: TObject);
var
oTmp : OleVariant;
vTmp : Variant;
begin
Len := MSComm1.InBufferCount;
oTmp := MSComm1.Input;
vTmp := VarArrayCreate([0, len-1], varByte);
vTmp := oTmp;
进行一些操作。。。
end;
问题点数:100、回复次数:15Top
1 楼feiyunxiaozi()回复于 2005-06-03 14:10:58 得分 0
先自己顶一个Top
2 楼feiyunxiaozi()回复于 2005-06-03 14:22:54 得分 0
没人知道吗?Top
3 楼heluqing(鉴之小河〖劳累求充实〗)(vcl .net)回复于 2005-06-03 14:48:18 得分 5
不懂,Up...Top
4 楼comanche(太可怕)回复于 2005-06-03 15:05:47 得分 0
VarArrayCreate 建立的内存是引用记数的, 只要计数为 0 时会自动释放, 这段代码在函数完成后就释放了Top
5 楼feiyunxiaozi()回复于 2005-06-03 15:15:54 得分 0
TO:comanche(太可怕)
函数完成后指的是
vTmp := VarArrayCreate([0, len-1], varByte);
运行完后就释放吗?
不会吧Top
6 楼jslygwx(海豚)回复于 2005-06-03 15:29:18 得分 0
vtmp.free?Top
7 楼comanche(太可怕)回复于 2005-06-03 15:55:39 得分 0
你下面不是还有操作嘛, 在函数退出时, vTmp 生存期结束, 他会给分配的内存作引用 -1, =0 时就会释放Top
8 楼comanche(太可怕)回复于 2005-06-03 16:00:22 得分 0
你可以试一下,
var
temp: Variant
ptr: PChar;
begin
temp := VarArrayCreate([0..1024*1024], varByte); // 建立 1m 内存
ptr := VarArrayLock(temp);
try
ptr[0] := 'h'; // 在这放一个断点, 看windows任务管理器, 等一会, 看内存占用
ptr[1] := #0;
ShowMessage(strint(ptr));
finally
VarArrayUnlock(ptr);
end;
end; // 在退回后, 调用者下一句放断点, 看内存会不会释放
还有, Variant, OleVariant 在 delphi 下是通用的, 只要定义 Variant 类型就可调用任何com方法.Top
9 楼feiyunxiaozi()回复于 2005-06-06 10:39:39 得分 0
TO:comanche(太可怕)
请问你的意思是不是Delphi会自动释放内存,而不用任何操作?
但我的怎么就会内存不断的增加呢?
能说详细一点吗Top
10 楼comanche(太可怕)回复于 2005-06-06 13:26:13 得分 0
用 bcb 就可以看到, Variant 析构函数, if ReleaseRef = 0 then 内存释放
你的内存增加不是这里发生的Top
11 楼feiyunxiaozi()回复于 2005-06-06 14:05:39 得分 0
TO:comanche(太可怕)
请问“if ReleaseRef = 0 then 内存释放”中的ReleaseRef 是什么东西,
还有你的意思是不是说我的内存增加不是VarArrayCreate所造成的问题?Top
12 楼comanche(太可怕)回复于 2005-06-06 14:44:50 得分 35
对, 内存增加不是这里产生的
看 IUnkonw 接口, 所有自动对像, 都是用此类办法作引用记数
引用记数也可以在设计模式里找到Top
13 楼feiyunxiaozi()回复于 2005-06-06 15:45:08 得分 0
TO:comanche(太可怕)
下面是我的MSComm1Comm事件的代码,那你认为是那里出现内存泄漏问题呢?
procedure TFMain.MSComm1Comm(Sender: TObject);
var
Len,post,i,j : Integer;
oTmp : OleVariant;
sTmp : string;
bTmp : byte;
vTmp : Variant;
begin
try
Len := MSComm1.InBufferCount;
oTmp := MSComm1.Input;
vTmp := VarArrayCreate([0,Len-1], varByte);
vTmp := oTmp;
sTmp:='';
post := 0;
i := 0;
while i < Len do begin
try
if vTmp[i]= $1C then begin
while vTmp[i]<> $54 do
begin
bTmp := vTmp[i];
AByteGet[counter] := vTmp[i];
sTmp := sTmp + inttohex(ord(chr(bTmp)),2)+ ' '; //16进制接收
Inc(counter);
Inc(i);
end;
AByteGet[counter] := $54;
mun := counter+1;
counter := 0;
sTmp:='';
end //end if
else Inc(i);
except
end;
end;//end wihile
finally
vTmp := -1;
end;
end;
Top
14 楼feiyunxiaozi()回复于 2005-06-07 16:59:50 得分 0
顶阿Top
15 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-06-07 17:36:37 得分 60
最后用
vTmp := Unassigned;
应该就可达到让系统自己释放的效果Top




