怎么才能把Tmemorystream释放掉?(100分)

  • 主题发起人 主题发起人 huanq
  • 开始时间 开始时间
H

huanq

Unregistered / Unconfirmed
GUEST, unregistred user!

有一段程序
for i:=0 to serversocket1.Socket.ActiveConnections-1 do
begin
if i=0 then
begin
b:=tmemorystream.Create;
b.Write(a,sizeof(a));
end;
b.Position:=0;
try
serversocket1.Socket.Connections.Sendstream(b);
except
break;
end;
if i=(serversocket1.Socket.ActiveConnections-1) then
begin
b.Position:=0;
b.Clear;
// b.free;
end;}
end;

(a 为我要传送的数组)
可每次执行到
b.clear;
都出现错误 Access violation at address ......
换成
b.free;
也不行
请各位大虾指点一二,多谢!
 
i不为0的时候b:=tmemorystream.Create;执行不到,
这时候b=nil了,当然要错了,呵呵
 
分特,你看看help就知道了,clientsocket和serversocket的tmemorystream不用释放的。
 
不好意思,说错了,是程序给你释放了,不用你动手。
 
不好意思,刚才没有看清楚,我对这个问题也不太熟,
下面是一个调试通过了的函数,希望对你有所帮助.
procedure CompressBitmap(bmp: TBitmap; var Data: string);
var
cs : TCompressionStream;
ms : TMemoryStream;
begin
ms := TMemoryStream.Create;
cs := TCompressionStream.Create(clDefault, ms); // clDefault is a LOT faster than clMax

bmp.SaveToStream(cs);
cs.Free;

SetLength(Data, ms.Size);
Move(ms.Memory^, Data[1], ms.Size);

ms.Free;
end;
 
to firnwolf
你是说 tmemorystream用一次就被释放掉了吗?
再循环回来,就不行了?
 
to huanq:
我第一此说错了,
jieson说的对.delphi help里有,我把它copy下来了.
Note: The Stream passed as a parameter to SendStream becomes 搊wned?by the windows socket object. The Windows socket
object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.
 
系统自动释放,你不用自己释放,如果流长度超过4k系统将分多次发送的!你无法直接释放!
 
多人接受答案了。
 
后退
顶部