CImageList will release all the elements when it is released. Based on msdn, If the image list was created with the new operator, you must destroy the CImageList object when you are done with it, which means in the descontructor of CImageList, it release all its elements.
You can try to use DebugDiag to debug memory/GDI leak issues, it's better than just looking into the code to identify a leak.