我已经阅读了很多关于内存管理的内容,但目前还有一些我无法掌握的内容。这可能看起来很尴尬,但下面的代码有
此功能“位图b = Iprocessing.Colour_style(位图a)”获取灰度图像a并给出颜色并返回彩色图像b
我一直认为,由于未使用new
关键字,处理后的变量images[1]
将替换旧内容,并且不会创建新内存。
请赐教我
for(int i=0; i<images.Count;i++) {
images[i] = Iprocessing.Colour_style((Bitmap)images[i]);
}
答案 0 :(得分:0)
这里的变量是i
和images
(甚至images
我看不到声明也无法确定 - 它可能是一个领域)。 images
这里只是(看起来像)List<Image>
的引用 - 所以整个images
是4或8个字节。列表本身将占用更多空间;有对象本身,加上支持数组,加上几个计数器。交换列表中的项目,就像交换数组中的元素一样,不涉及在列表/数组中分配任何额外的空间。
可能(几乎肯定是 )导致分配的一件事是IProcessing.Color_style
。这样的声音将基于旧图像创建新图像(而不是更改旧图像)。此外,看起来很像你没有处理旧图像 - 所以如果这是唯一的地方你正在使用那个图像,你可能会造成一些问题:图像是IDisposable
并且链接到GDI +句柄;如果你不处理它们,你可能会遇到OutOfMemoryException
没有链接到内存但实际上是GDI +句柄的问题。特别是如果你有大量的备用内存,那么垃圾收集不会经常发生。当然,这也有点复杂,因为如果 在其他地方(在控件等上)使用该图像,那么 不 想要现在处理它!
一行不需要让new
涉及分配(分配可以隐藏在方法调用,运算符,属性之后);同样,并非涉及new
的每一行都需要分配(值类型在现有位置的顶部进行初始化)。