我用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;
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分求Combobox多字段的下拉菜单效果,求高手指点
- 李维 是谁啊?干什么的啊
- 【版务】delphi版投诉专区和部分处理公告
- 关于在程序中实现对Word模板的调用
- 谁有好用的第三方报表控件?
- 有关记录的长度问题
- 关于table['字段'],table.fieldbyname('字段')和table.fieldvalues['字段']的看法
- 关于clientsocket和serversocket的问题!
- 在配ODBC的数据源时到使用用户登录ID和密码SQL Server 验证下一步时的问题
- 关于如何调用access中的动作类查询?
- 字符串转换为窗体控件类时碰到的问题
- DELPHI语法,送分问题。
函数完成后指的是
vTmp := VarArrayCreate([0, len-1], varByte);
运行完后就释放吗?不会吧
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方法.
请问你的意思是不是Delphi会自动释放内存,而不用任何操作?
但我的怎么就会内存不断的增加呢?
能说详细一点吗
你的内存增加不是这里发生的
请问“if ReleaseRef = 0 then 内存释放”中的ReleaseRef 是什么东西,
还有你的意思是不是说我的内存增加不是VarArrayCreate所造成的问题?
下面是我的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;
应该就可达到让系统自己释放的效果