请注意,此操作以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/

10-11 10:34