Почему после вызова dispose on bitmap object объекты GDI не освобождаются сразу
Я создаю растровый объект и из этого растрового объекта создаю значок, а затем размещаю их соответствующим образом. Во время выполнения кода я собирал количество объектов GDI после каждой операции GDI. Заметил, что после вызова Dispose для объекта Bitmap количество объектов GDI остается прежним.
class Icon_ResouceLeak { static void Main(string[] args) { // the program starts with 18 GDI objects.. var bmp = new Bitmap("imagePath"); // 25 GDI objects.. IntPtr ptr = bmp.GetHicon(); // 30 GDI Objects.. Icon newIcon = Icon.FromHandle(ptr); var clonedIcon = (Icon)newIcon.Clone(); // 33 GDI objects.. DestroyIcon(newIcon.Handle); // 30 GDI objects .. clonedIcon.Dispose(); // 27 GDI objects .. newIcon.Dispose(); // 27 GDI objects.. bmp.Dispose(); // still 27 GDI objects? } [DllImport("user32.dll", CharSet = CharSet.Auto)] extern static bool DestroyIcon(IntPtr handle); }
Что я уже пробовал:
bmp.Dispose() вызывает изображение.Диспсо(). Который внутренне вызывает SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(this, nativeImage));
если это так, то почему он не освобождается.