请注意,此操作以WPF/C#
完成,而不是.net2.0
Winforms
我有一个列表框,其中包含说Class X
的对象。 X类包含一个BitmapSource
对象,该对象显示在列表框中,因此它的显示类似于[Image] [Text]
这是通过使用CreateBitmapSourceFromHBitmap
加载的-还请注意,我在调用期间调用DeleteHBitmap
来删除HBitmap
的句柄,众所周知,这是我在google/etc上看到的帖子中所做的事情
我有一棵树,其中每个ListBox
中都包含所说的TreeViewItem
-通常,该树已加载了多个项目。用户可以将这些图像拖放到不同的TreeViewItems中。为了处理这些操作,我手动调用了这些操作:
<code>
ItemCollection.RemoveAt
</code>
<code>
ItemCollection.Insert
</code>
从列表盒项目集合中对图像进行
move
,请注意,当我插入时,我创建了一个新的Class X
对象以插入到ListBox
项目集合中我注意到在5-10分钟的一致拖放时间内,多次调用此类操作会导致一致的内存泄漏。
我的问题是:
我是否正确处理了
BitmapSource
的移动?我是否正在做一些导致图像无法从ItemCollection
中完全删除的事情?还是我错过了一些基本的东西?
最佳答案
这是在您的ClassX中保存图像的变量的定义????问题可能在于您正在创建一个新的ClassX,而旧的并没有被GC删除,从而使磁头具有两个不同的ClassX实例。
由于您使用的是未经管理的代码(CreateBitmapSourceFromHBitmap),因此应检查是否正确调用了所有finalize方法(尽管可能关闭或处置),并且没有可指向您的ClassX的静态引用。
请记住,如果不删除ClassX,则在由GC生成的图形中将可以访问Bitmap实例,从而使其不会从堆中删除。
我建议使用perfmon并添加.Net内存对象,以查看是否存在任何在finalize或pinned对象中幸存的对象,这些是您可能对内存泄漏感兴趣的对象。
我希望它对:P有帮助,但是如果您输入ClassX的代码,它将更好。
关于c# - WPF/C#中的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/469316/