尽管bummi 很好地解释了为什么Image1.Picture := nil
不会导致内存泄漏,但我担心它可能会在阅读我的代码的新人的脑海中引发危险信号,因为它的安全性是违反直觉的。因此,我想避免它。存在哪些更直观的替代方案?虽然 bummi 的回答是针对 Delphi,但我实际上对 C++Builder 更感兴趣。
4 回答
1
另一种方法是使用Image->Picture->Assign(NULL);
,这实际上是Image->Picture = NULL;
在内部做的。
于 2014-08-28T06:13:05.110 回答
0
我已经设置Image1.Visible
为false
使图片消失。
- 缺点:您必须恢复
Visible
到true
要显示下一张图像的时间。 - 优点:如果您碰巧想要显示一张特定的图像,但仅在特定时间显示,那么切换可见可能比清除和重新加载更有效。
于 2014-08-24T12:47:39.353 回答
0
如果您担心读者不理解这image.Picture := nil;
意味着什么,并且您已经确定这是清除图像的最直接的方法,请添加注释说明属性设置器的作用。
不过,我不一定同意它需要任何改变。众所周知,属性设置器可能会产生副作用,并且在 Delphi 中没有约定,在将属性设置为特定值后,重新读取该属性将返回相同的值。事实上,在 VCL 中,我怀疑不返回刚刚设置的相同值的属性更常见。
无论哪种方式,无论是否发表评论,我都会nil
按原样留下作业。
于 2014-08-24T13:03:21.953 回答
0
封装属性赋值有两个好处:
- 一个位置来记录它的非泄漏性(DRY)
- 一个看起来不那么令人担忧的界面,可以在其他任何地方使用
例如:
// Not a memory leak: see http://stackoverflow.com/a/23999207/782738
#define ClearImage(Image) Image->Picture = NULL
于 2014-09-06T15:17:15.253 回答