我用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;

解决方案 »

  1.   

    VarArrayCreate 建立的内存是引用记数的, 只要计数为 0 时会自动释放, 这段代码在函数完成后就释放了
      

  2.   

    TO:comanche(太可怕)
    函数完成后指的是
    vTmp := VarArrayCreate([0, len-1], varByte);
    运行完后就释放吗?不会吧
      

  3.   

    你下面不是还有操作嘛, 在函数退出时, vTmp 生存期结束, 他会给分配的内存作引用 -1, =0 时就会释放
      

  4.   

    你可以试一下, 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方法.
      

  5.   

    TO:comanche(太可怕)
    请问你的意思是不是Delphi会自动释放内存,而不用任何操作?
    但我的怎么就会内存不断的增加呢?
    能说详细一点吗
      

  6.   

    用 bcb 就可以看到, Variant 析构函数, if ReleaseRef = 0 then 内存释放
    你的内存增加不是这里发生的
      

  7.   

    TO:comanche(太可怕)
    请问“if ReleaseRef = 0 then 内存释放”中的ReleaseRef 是什么东西,
    还有你的意思是不是说我的内存增加不是VarArrayCreate所造成的问题?
      

  8.   

    对, 内存增加不是这里产生的看 IUnkonw 接口, 所有自动对像, 都是用此类办法作引用记数引用记数也可以在设计模式里找到
      

  9.   

    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;
      

  10.   

    最后用  vTmp :=  Unassigned;
    应该就可达到让系统自己释放的效果