郁闷,图像的释放问题,请各位帮忙,谢了.(30分)

  • 主题发起人 主题发起人 sxwy
  • 开始时间 开始时间
S

sxwy

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是一个返回类型为BMP的函数
Function Tform1.Resultbmp():Tbitmap;
Var Tmpbmp:Tbitmap;
begin
Tmpbmp:=Tbitmap.Create ;
Tmpbmp.Canvas.Brush.Color :=Clblack;
Tmpbmp.Canvas.FillRect(Tmpbmp.Canvas.ClipRect );
Tmpbmp.Canvas.Font.Color :=Clred;
Tmpbmp.Width :=128;
Tmpbmp.Height :=64;
Tmpbmp.Canvas.TextOut(0,0,'测试BMP');
Result:=Tmpbmp; //返回BMP
Tmpbmp.Free ; //释放BMP
end;


但用下同的方法调用会出错.主要就是上面的函数里加了TMPBMP.FREE,上面不加TMPBMP.FREE就不会出错.
但是如果不加TMPBMP.FREE的话,那么实际上调后RESULTBMP
函数之后,在内存里的一个TMPBMP的空间是没有释放的.
那么有没有办法释放这种函数所产生的内存空间呢.
请帮一下忙,谢谢.
以下是调用过程.
Var TTT:Tbitmap;

Ttt:=Tbitmap.Create ;
Ttt:=Resultbmp(); //调用函数
TTT.REEE;

以前我就出现过这样的错误,如果在RESULTBM函数不加Tmpbmp.free,那么被调用N次后,就会出现计算机内存不足的原因.而且每调用一次,都可以看到计算机的内存在减少.
但如果加了tmpbmp.free呢,却又无法正确的返回BMP图像.
 
Function Tform1.Resultbmp():Tbitmap;
在函数中返回的对象已经被你FREE了,也就是说返回的对象已经释放了。

Ttt:=Resultbmp(); //调用函数
TTT.FREE;
你再次调用FREE当然会出错了。

这样试试:
1、首先取消函数里的FREE
//Tmpbmp.Free ; //释放BMP
2、调用
Var TTT:Tbitmap;

//Ttt:=Tbitmap.Create ; //注释掉这句
Ttt:=Resultbmp(); //调用函数
TTT.REEE;

也可以直接传入TBitmap,改写一下函数
Procedure Tform1.Resultbmp(tmpBmp: Tbitmap);
begin
Tmpbmp.Canvas.Brush.Color :=Clblack;
Tmpbmp.Canvas.FillRect(Tmpbmp.Canvas.ClipRect );
Tmpbmp.Canvas.Font.Color :=Clred;
Tmpbmp.Width :=128;
Tmpbmp.Height :=64;
Tmpbmp.Canvas.TextOut(0,0,'测试BMP');
end;

以下是调用过程.
Var TTT:Tbitmap;

Ttt:=Tbitmap.Create ;
Resultbmp(TTT); //调用函数
TTT.REEE;
 
在Resultbmp里的tmpbmp和在外面的TTT是两个不同的对像
在Resultbmp里对tmpbmp的释放,和外部的TTT的释放是两个不同的过程呀.
还是不清楚.
TO:
shunzi1220
如果在Resultmbp里不对tmpbmp进行释放,你的意思是说每次调用这个函数后会自动释放,那么为什么我在调用N次后,计算机的内存会好多呢.
 
你返回的是Tbitmap对象, 查一下相关资料就可以知道,它其实是一个指针。

大概意思如下,表达可能不是很准确,呵呵。

ttt := TBitmap; //将ttt指向了内存区域A
ttt := ResultBmp; //将ttt指向了新的内存区域B
{
Tmpbmp:=Tbitmap.Create ; //内存B
...
tmpBmp.Free; //B被你释放了
}
ttt.Free; //释放B

看看就知道错误和内存泄露在哪了。
 
sxwy:
按照你的调用方式肯定会出错。
用shunzi220的方法应该可以解决你的问题!
你试一下?
而且你的理解有错误,任何显示创建的对象必须要手动对其进行释放,一般不会自动释放!
 
函数改过程,并且不要用返参的形式,所有类的操作都应该是样

procedure Tform1.Resultbmp(BMP:TBitmap);
Var Tmpbmp:Tbitmap;
begin
Tmpbmp:=Tbitmap.Create ;
Tmpbmp.Canvas.Brush.Color :=Clblack;
Tmpbmp.Canvas.FillRect(Tmpbmp.Canvas.ClipRect );
Tmpbmp.Canvas.Font.Color :=Clred;
Tmpbmp.Width :=128;
Tmpbmp.Height :=64;
Tmpbmp.Canvas.TextOut(0,0,'测试BMP');
BMP.assign(Tmpbmp);
Tmpbmp.Free ; //释放BMP
end;
 
Tmpbmp.freeiamge;
 
后退
顶部