读书人

释放内存解决方法

发布时间: 2012-03-06 20:47:55 作者: rapoo

释放内存
小弟写了一个传送图片的程序
运行是没有问题,可以传送
但是在关闭的程序的时候还是会有问题,好像是内存没有释放完,就是出现这个

这是一部分源程序
Client
procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
intreceivelength:integer;
strReceive:string;
araymybuffer:array[1..10000] of byte;
MyBmp:TBitmap;
MyJpg:TJpegimage;

begin
if intmysize=0 then
begin
strReceive:=socket.ReceiveText;
intmysize:=strtoint(strReceive);
ls.Items.Add('Receive the bmp size is '+inttostr(intmysize)+' K');
socket.SendText('ready');
end
else
begin
intreceivelength:=socket.ReceiveLength;
socket.ReceiveBuf(araymybuffer,intreceivelength);
mystream.Write(araymybuffer,intreceivelength);
ls.Items.Add('Receive buffer ' + inttostr(intreceivelength)+' k');
if mystream.Size >= intmysize then
begin
mystream.Position:=0;
mybmp:=Tbitmap.Create;
MyJpg:=TJpegimage.Create;
myjpg.LoadFromStream(mystream);
mybmp.Assign(myjpg);
mybmp.SaveToFile('D:\1.bmp');
mybmp.Free;
myjpg.Free;
mystream.Free;
intmysize:=0;
ls.Items.Add('send over !');
end;
end;
end;

Server:

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
strreceive:string;
begin
strreceive:=socket.ReceiveText;
if strreceive='length' then
begin
Socket.sendtext(inttostr(intsize)); {发送流大小}
label2.Caption:='Connection !';
end;

if strreceive='ready' then
begin
mystream.Position:=0;
socket.SendStream(mystream);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MyBmp:TBitmap;
Myjpg:TJpegimage;

begin
op.Execute;
mstrfilename:=op.Filename;
MyBmp:=TBitmap.Create;
Myjpg:=TJpegimage.Create;
mybmp.LoadFromFile(mstrfilename);
lg.Picture.Bitmap.Assign(mybmp);
Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
Myjpg.free;
mybmp.Free;
MyStream.Position:=0; {注意:必须添加此句}
intsize:=MyStream.size; {流的大小}
label1.Caption:='bmp size is: ' + inttostr(intsize) + ' K';
end;

我在它们主窗体关闭事件里都写了mystream.free
我想加mybmp.free
myjpg.free
可是加不了.....

但是我在程序里我都释放了呀为什么还会有没有

[解决办法]
1.因为mystream:= nil;了所以 mystream.Free; 不会错
请看 free的代码: asm test eax ,eax
je @@exit
就是判断对象为nil就退出

2,mystream.Free;并没有将mystream置为nil只是释放了它占的空间,所以再调就会出错
如需再释放时同时置为nil请用freeandnil();

读书人网 >.NET

热点推荐