因此,在发现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资源的代码。
答案 0 :(得分:8)
由于你在这个例子中提供了流,我想你有责任处理它。
答案 1 :(得分:3)
使用打开流的方法也是一个好习惯,也可以关闭它。这样就可以更容易地跟踪泄漏情况。让另一个对象关闭你打开的流是很奇怪的。
答案 2 :(得分:0)
因为位图无法保证析构函数的调用顺序,所以它不会关闭流,因为在垃圾回收期间它可能已经用自己的析构函数关闭了。杰弗里里希特的CLR通过C#有一章关于内存管理的解释比我更清晰。