Bitmap类不配置流?

Lil*_*ver 11 .net c# system.drawing gdi+ memory-leaks

因此,在发现Bitmap类期望原始流在图像或位图的生命周期内保持打开之后,我决定找出Bitmap类在处理时是否实际关闭了流.

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

num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);
Run Code Online (Sandbox Code Playgroud)

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

我可以继承Bitmap来解决这个问题,但是,等等,它是密封的.

请告诉我,我错了,并且MS不仅无法编写不会泄漏API资源的代码.

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

C.E*_*uis 8

由于您在此示例中提供了流,因此我认为您有责任处理它.

  • 好吧,如果 (a) 它可以将它 100% 加载到内存中,而不是仅 99% 加载到内存中,(b) 不被 *密封*,(c) 提供一个处置事件,(d) 有一个布尔值来关闭流在处置时,或 (e) 只是保留对流的臭引用,以便 GC 正常工作,使用起来会容易得多。 (2认同)