定义一个结构
type
  pSendMsg =^TSendMsg;
  TSendMsg= packed record
    Source:String;
    Dest:String;
    Content:String;
  end;
var
为了测试内存得释放情况。设置了一下下面得程序
在一个Timer 得ontimer事件中,申请内存,释放内容。
procedure TForm1.Timer1Timer(Sender: TObject);
var
  sdMsg :pSendMsg;
  br:Boolean;
begin
  new(sdMsg) ;
  sdMsg^.Source:='Source';
  sdMsg^.Dest :='Dest'; 
  sdMsg^.Content:='Hello World';
  dispose(sdMsg);
  //sdMsg := Nil;
end;
结果发现随着程序得运行,这个程序使用得内存越来越大!
这是为什么,难道是没有释放内存么?
但是dispose不是已经把内存释放了么!

解决方案 »

  1.   

    应该没问题,你试试把packed去掉。
      

  2.   

    怎么可能,我运行了好多次都会的,你把这个拷过去运行的?你把Timer1.interval := 10 k看看,肯定会一直增加的。
      

  3.   

    我用MemProof监视程序运行,也没见一直增加。
      

  4.   

    我在任务管理器里面的进程管理,观察那个进程中的内存使用,结果发现一直增加呀。4k、4k的增加呀。把那个timer1.inertval =10,把他设置为小一点,试试看,应该会增加的。
      

  5.   

    你调节到10根本没有用,系统仍然是54.9毫秒左右触发一次,
    New后用Dispose释放,Delphi只是把用new申请的内存标记为丢弃,并没有释放,如果有别的程序申请内存,那么有可能就会分配这部分内存出去!在没有其他程序申请内存的时候,增加也不是不可能的!
      

  6.   

    type
      pSendMsg =^TSendMsg;
      TSendMsg= packed record
        Source:String;
        Dest:String;
        Content:String;
      end;上面的代码是不是定义了一个指向记录类型(tsendmsg)的指针类型变量?
    在定义记录类型时用到 PACKED是什么用处啊?
      

  7.   

    这样试验,未发现内存的变化。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sdMsg :pSendMsg;
      br:Boolean;
    begin
      while true do
      begin
        new(sdMsg) ;
        sdMsg^.Source:='Source';
        sdMsg^.Dest :='Dest';
        sdMsg^.Content:='Hello World';
        dispose(sdMsg);
      //sdMsg £º= Nil£»
     end;
    end;
      

  8.   

    To: hiflower(花),如果按你这样写的画,虽然内存好像没有增加(我不敢在看),因为我的cpu被占用了97%,我的问题是在timer里面的,你在那里面调试看看。应该是会增加的。
      

  9.   

    我测试过了。我在timer.ontimer 事件里面,什么东西都不写,结果内存还是一直在增加。我想这个内存的增加应该跟我的new和dipose关系不大,而可能跟timer的ontimer有点关系吧。能帮我分析分析这是为什么?
      

  10.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      sdMsg :pSendMsg;
      br:Boolean;
    begin
     // while true do
      begin
        new(sdMsg) ;
        sdMsg^.Source:='Source';
        sdMsg^.Dest :='Dest';
        sdMsg^.Content:='Hello World';
        dispose(sdMsg);
      //sdMsg £º= Nil£»
     end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    timer1.enabled:=true;
    end;
    Win2000+D6,没有任何问题