0

我已经阅读了很多关于内存管理的内容,但目前仍有一些内容我无法掌握。这可能看起来很尴尬,但下面的代码是否有

  1. 性能问题
  2. 内存浪费

此函数“Bitmap b=Iprocessing.Colour_style(Bitmap a)”获取灰度图像 a 并为其赋予颜色并返回彩色图像 b

我一直的想法是,由于new没有使用关键字,因此images[1]处理后的变量将替换旧内容,并且不会创建新内存。

请赐教

  for(int i=0; i<images.Count;i++)   {   
    images[i] = Iprocessing.Colour_style((Bitmap)images[i]);
  }
4

1 回答 1

0

这里的变量iand images(即使images没有看到声明我也无法确定——它可能是一个字段)。images这里只是对(看起来像)a 的引用List<Image>- 所以整个 ofimages是 4 或 8 个字节。列表本身会占用更多空间;有对象本身,加上支持数组,加上一些计数器。交换列表中的项目,就像交换数组中的元素一样,不涉及在列表/数组中分配任何额外的空间。

可能(并且几乎肯定)导致此处分配的一件事是IProcessing.Color_style. 听起来这将基于旧图像创建新图像(而不是就地更改旧图像)。此外,看起来很像您没有处理旧图像 - 因此,如果这是您使用该图像的唯一地方,您可能会给自己带来一些问题:图像IDisposable已链接到 GDI+ 句柄;如果您不处理它们,您可能会遇到与内存OutOfMemoryException无关的问题,但实际上是 GDI+ 句柄。特别是如果你有很多空闲内存,那么垃圾收集就不会经常发生。当然,这也有点复杂,因为如果您其他地方(在控件等上)使用该图像,那么您现在不想处理它!

一行不需要new涉及分配(分配可以隐藏在方法调用、运算符、属性后面);同样,并非涉及的每一行都new需要分配(值类型在现有位置的顶部初始化)。

于 2013-04-17T06:34:30.840 回答