首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

释放内存解决方法

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

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

这是一部分源程序
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();

热点排行