Bitmap类不配置流?

时间:2011-05-25 10:53:40

标签: c# .net memory-leaks gdi+ system.drawing

因此,在发现that the Bitmap class expects the original stream to stay open for the life of the image or bitmap之后,我决定找出Bitmap类在处理时是否实际关闭了流。

查看源代码,Bitmap和Image类创建一个GPStream实例来包装流,但不存储对GPStream或Stream实例的引用

num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);

现在,GPStream类(内部)没有实现Release或Dispose方法 - 什么都不允许GDI关闭或处理流。由于Image / Bitmap类没有保留对GPStream实例的引用,似乎 GDI,Drawing.Bitmap或Drawing.Stream 绝对没有办法正确关闭流。

我可以将Bitmap子类化来解决这个问题,但是,等等,它是密封

请告诉我,我错了,并且MS不会让不可能编写不会泄漏API资源的代码。

请记住(a),Bitmap具有 no 对流的管理引用,这意味着GC将在它仍在使用时收集它,并且(b).NET API采用位图/图像引用并且不确定他们什么时候完成它们。

3 个答案:

答案 0 :(得分:8)

由于你在这个例子中提供了流,我想你有责任处理它。

答案 1 :(得分:3)

使用打开流的方法也是一个好习惯,也可以关闭它。这样就可以更容易地跟踪泄漏情况。让另一个对象关闭你打开的流是很奇怪的。

答案 2 :(得分:0)

因为位图无法保证析构函数的调用顺序,所以它不会关闭流,因为在垃圾回收期间它可能已经用自己的析构函数关闭了。杰弗里里希特的CLR通过C#有一章关于内存管理的解释比我更清晰。