0

尽管bummi 很好地解释了为什么Image1.Picture := nil不会导致内存泄漏,但我担心它可能会在阅读我的代码的新人的脑海中引发危险信号,因为它的安全性是违反直觉的。因此,我想避免它。存在哪些更直观的替代方案?虽然 bummi 的回答是针对 Delphi,但我实际上对 C++Builder 更感兴趣。

4

4 回答 4

1

另一种方法是使用Image->Picture->Assign(NULL);,这实际上是Image->Picture = NULL;在内部做的。

于 2014-08-28T06:13:05.110 回答
0

我已经设置Image1.Visiblefalse使图片消失。

  • 缺点:您必须恢复Visibletrue要显示下一张图像的时间。
  • 优点:如果您碰巧想要显示一张特定的图像,但仅在特定时间显示,那么切换可见可能比清除和重新加载更有效。
于 2014-08-24T12:47:39.353 回答
0

如果您担心读者不理解这image.Picture := nil;意味着什么,并且您已经确定这是清除图像的最直接的方法,请添加注释说明属性设置器的作用。

不过,我不一定同意它需要任何改变。众所周知,属性设置器可能会产生副作用,并且在 Delphi 中没有约定,在将属性设置为特定值后,重新读取该属性将返回相同的值。事实上,在 VCL 中,我怀疑返回刚刚设置的相同值的属性更常见。

无论哪种方式,无论是否发表评论,我都会nil按原样留下作业。

于 2014-08-24T13:03:21.953 回答
0

封装属性赋值有两个好处:

  1. 一个位置来记录它的非泄漏性(DRY
  2. 一个看起来不那么令人担忧的界面,可以在其他任何地方使用

例如:

// Not a memory leak: see http://stackoverflow.com/a/23999207/782738
#define ClearImage(Image) Image->Picture = NULL

于 2014-09-06T15:17:15.253 回答