从list中取图标,刷新时内存泄漏 如何解决? ( 积分: 100 )

  • 主题发起人 hitman007260
  • 开始时间
读取地址错误
access violation at address 0066658c........'
 
这样的话 image没创建 没有分配内存空间
 
对了,你的image要预先创建的啊。
先创建一个image,然后从tlist内获得图片
然后处理。
使用完毕后释放。

另外,如果不创建image也可以
直接使用 timage(imagelist.items)
 
先创建一个image,然后从tlist内获得图片
然后处理。
使用完毕后释放。

这个方法我试过了 都不行
 
在tlist内保存的其实是一个一个创建好的对象的指针。
可以直接使用的啊,只需让其在合适的位置显示就可以了。
 
现在我怀疑是dephi7得frame 再bcb6中的问题
 
image:=imagelist.items; 这句话就是把image得指针直接指到创建好的对象的指针

在别的地方用过 没有问题 改变别的属性如top ,left时 都没有问题
就是改变里面的bitmap出问题了
 
哦,我以为image是一个本来就创建了的控件。
那么试试这样,看内存是否增长。
image:=imagelist.items;
image.Canvas.textout(5,5,'test');
image.repaint(); //此句先不加,看能否显示文字
 
image.Canvas.textout(5,5,'test');
不加image.repaint();
内存就增加
比闪烁还增的快 每个周期增32k左右
image:=imagelist.items;
w:= image.Picture .Bitmap.Width ;
h:=image.Picture.Bitmap.Height ;
hdc2:=image.Canvas.Handle;
hdc1:=image.Canvas.Handle ;
bitblt(hdc2,0,0,w,h,hdc1,0,0,notsrccopy);
image.repaint();
去掉image.repaint();
内存就不增加了 但是图像也不闪烁了
 
这样试试看:
w:= Timage(imagelist.items).Picture .Bitmap.Width ;
h:=Timage(imagelist.items).Picture.Bitmap.Height ;
bitblt(Timage(imagelist.items).Canvas.Handle,0,0,w,h,Timage(imagelist.items).Canvas.Handle,0,0,notsrccopy);
Timage(imagelist.items).repaint(); //这句先不加
 
不加Timage(imagelist.items).repaint();
内存不增加
加Timage(imagelist.items).repaint(); 内存增加
 
不加Timage(imagelist.items).repaint();
内存不增加 如果遮挡了这个图标 拿开了以后 这个图标正好是取反图像 就会刷新 内存就增长
 
repaint(); 会调用系统函数重绘
遮挡的图标拿开后也会引起系统重绘。
我试了一下,别的什么不写,就一句image1.repaint();
也会引起内存增加,运行第一次增加4k,再持续多次运行此语句,内存不在增加,或偶尔又增加4k。
估计是系统缓存导致的内存增加吧。
 
不是 我得知增加不减少 程序都崩溃过
 
每次都增加30k左右 有什么可以强制清缓存的程序吗?
 
另外,怀疑你的系统是否有问题
在我的电脑上,就一句,
Bitblt(Image1.Canvas.Handle, 0, 0, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height, Image1.Canvas.Handle, 0, 0, notSRCCOPY);

图片已经取反并显示了,无需手工调用repaint();

并且程序占用的内存减少了几k

如果后面再加上一句image1.repaint();情况一样,也是占用的内存减少。
 
我的是xp sp2版
delphi6 update2版
 
我得是xp sp2
bcb6 +delphi7
程序是在delphi7 编得frame中的
工程是bcb6调用 frame
 
图片已经取反并显示了,无需手工调用repaint();

不会把!!
我试过 不行
 
ufo!
能加你qq吗?
我qq117830882
 
顶部