Vorsicht bei ImageList und TreeView


Thomas Wölfer
Thomas Wölfer

04. Dezember 2006


Im Zusammenhang mit ImageLists und TreeViews gibt es einen Umstand, den ich für einen Bug in der TreeView halte - und der unter den richtigen Umständen zu einem Memory-Leak führt.

Angenommen, man hat eine Form mit einer TreeView, und weist der TreeView eine ImageList zu, die sich in einem anderen Objekt als der Form befindet. Zum Beispiel eine ImageList die irgendwo statisch definiert ist. Wenn man dies tut, dann wird beim schließen der Form der Finalizer für die TreeView nicht aufgerufen. Resultat: Das Control verschwindet zwar, aber die dahinter steckende Datenstruktur wird nicht freigegeben. Dazu gehören unter anderm auch die darin befindlichen TreeNodes, und alle Objekt, die über Referenzen in deren Tags erreicht werden können. Tendenziell kann das ganz schön umfangreich werden, was da nicht freigegeben wird.

Der Grund dafür ist der, das sich die TreeView beim Set-Accessor ( treeView.ImageList = staticImageList ) an Events der ImageList hängt, sich aber beim schliessen davon nicht mehr abhägt. Blöde Sache.

Einziges Workaround: Selbst die ImageList ausnullen, wenn die Form geschlossen wird. Connect Bug Entry hier.