次の方法で共有


Rule of thumb for System.Drawing

A friend of mine ran into this the other day.

If you call a method to get a handle some sort of System.Drawing object, you may be creating an object that needs to be cleaned up through P/Invoke or some other function call.

Bitmap.GetHIcon - requires p/invoking DestroyIcon.
Font.ToHFont - requires p/invoking DeleteObject
Graphics.GetHdc - requires calling Graphics.ReleaseHdc

The MSDN2 documentation seems to be a lot more clear about this, so if you're accessing a handle, you might want to pop over there to see if there are cleanup instructions. You might also consider using the GDICounter and reading the background info on when to use Dispose.

Comments

  • Anonymous
    July 25, 2006
    Isn't this the problem that SafeHandle was invented to solve?
  • Anonymous
    July 25, 2006
    If that's the way you want to wrap up your cleanup logic, that's fine.  You still have to write the call to the appropriate cleanup function for the handle.

    It's better to explicitly delete the object than clean it up in finalization.
  • Anonymous
    July 29, 2006
    I've been bitten by this.  It seems foolish to expose these through the BCL only to require PInvokes to clean them up after their use; if you can create them with the built-in .NET functions, why can't they be destroyed likewise?
  • Anonymous
    July 30, 2006
    The comment has been removed