Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bitmap class doesn't dispose stream?

So, after discovering that the Bitmap class expects the original stream to stay open for the life of the image or bitmap, I decided to find out if the Bitmap class actually closes the stream when it is disposed.

Looking at the source code, the Bitmap and Image classes create a GPStream instance to wrap the stream, but do not store a reference to either the GPStream or the Stream instance.

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

Now, the GPStream class (internal), does not implement a Release or Dispose method - nothing that would allow GDI to close or dispose of the stream. And since the Image/Bitmap class doesn't keep a reference to the GPStream instance, it seems that there is absolutely no way for either GDI, Drawing.Bitmap, or Drawing.Stream to close the stream properly.

I could subclass Bitmap to fix this, but, oh wait, it's sealed.

Please tell me I'm wrong, and that MS didn't just make it impossible to write code that doesn't leak resources with their API.

Keep in mind (a), Bitmap has no managed reference to the stream, meaning GC will collect it while it is still in use, and (b) .NET APIs take Bitmap/Image references and aren't deterministic about when they're done with them.

like image 736
Lilith River Avatar asked May 25 '11 10:05

Lilith River


2 Answers

Since you supply the stream in this example, I'd imagine you are responsible for disposing it.

like image 64
C.Evenhuis Avatar answered Oct 10 '22 17:10

C.Evenhuis


It is a good practice to have the method that opens a stream, close it as well. That way it is easier to keep track of leaks. It would be quite strange to have an other object closing the stream that you opened.

like image 36
Emond Avatar answered Oct 10 '22 16:10

Emond