在做一个屏幕即时监视程序时,发现一问题,就是用SendStream送出流后,无法再操作这个流:我有个全局的MyStream.处理后,用SendStream顺利发出,对方机也收到,但当我再次操作这个MyStream时(如设置它的Position,调用Clean)程序就会出错……相反,当我用局部的Stream时, 只要SendStream后,只要不调用这个局部Stream的Free程序照常,还很稳。但不知没有FREE掉的会不会让内存泄漏。以我菜鸟的经验觉得有两可能:
一:SendStream这方法会长时占过此流,使得无法操作。(是样就太惨了,要怎么才可以让它正确的FREE掉呢?)二:就是SendStream负责把它传送时,顺便FREE掉^_^,(呵呵,高手被我气到了没?有想象力哦我。)不过, 第二种可能性不大了,我看了SendStream前后的内存地址(@MyStream),没变,看来第一种的可能性很大,我要怎么办呀??帅哥&高手们??

解决方案 »

  1.   

    应该是自动 Free的,看一下SocktComp单元的SendStreamPiece函数!
      

  2.   

    没错,楼上说得对。SendStream在发送完成后,再次引用被发送的流就会产生错误。内存地址指向的内存空间已经被释放了,也就无法再对流进行操作。
      

  3.   

    有点不对样····指向内存流的指针不为 nil ,而且内存地址也没有变呀? (@MyStream)DELPHI的原码,我也看了,function TCustomWinSocket.SendStreamPiece: Boolean;
    var
      Buffer: array[0..4095] of Byte;
      .............
      procedure DropStream;
      begin
        if FDropAfterSend then Disconnect(FSocket);
        FDropAfterSend := False;
        FSendStream.Free;
        FSendStream := nil;
      end;begin
     ....
     ....
     ....
     虽多次调用内部过存 DropStream, 它真FREE了吗???
     为什么,我的MyStream指针不为nil???
    end;
      

  4.   

    你的变量值又没有被改变,它当然不为NIL。
    只是它指向的内存已经被释放了。
      

  5.   

    if FDropAfterSend then 不是源码里面有这句吗???
    两个函数:
    SendStream

    SendStreamThenDrop
    因为缺省值是FALSE,所以调用后一个函数才会帮你释放流。
    //-------------------------------------------------------------
    function TCustomWinSocket.SendStreamThenDrop(AStream: TStream): Boolean;
    begin
      FDropAfterSend := True;
      Result := SendStream(AStream);
      if not Result then FDropAfterSend := False;
    end;