WPF/C中的内存泄漏#

6 c# wpf

请注意,这是在,WPF/C#而不是在.net2.0 Winforms

我有一个ListBox,其中包含say的对象Class X.类X包含一个BitmapSource显示在列表框中的对象,因此它显示类似于[Image] [Text]

这是通过使用CreateBitmapSourceFromHBitmap- 注意我也打电话DeleteHBitmap删除HBitmap此调用期间的句柄,这是众所周知的从我在谷歌/等上看到的帖子做

我有一个树,其中包含ListBox每个TreeViewItem- 通常树有几个项目加载.用户可以将这些图像拖放到不同的TreeViewItem中.要处理这些操作,我手动调用操作:

<code>
    ItemCollection.RemoveAt
</code>

<code>
    ItemCollection.Insert
</code>
Run Code Online (Sandbox Code Playgroud)

move从列表框项集合图像,注意,当我插入我创建一个新的Class X对象插入到ListBox项目集合

我注意到,在5-10分钟的一致拖放空间中,我多次调用此类操作会得到一致的内存泄漏.

我的问题是:

我正在处理BitmapSource正确的移动吗?有什么我正在做的事情导致图像没有被完全删除ItemCollection

或者有什么根本我错过了?

man*_*del 1

ClassX 中保存图像的变量的定义是什么???问题可能在于,您正在创建一个新的 ClassX,而旧的 ClassX 不会被 GC 删除,从而导致头部有两个不同的 ClassX 实例。

由于您使用的是非托管代码 (CreateBitmapSourceFromHBitmap),您应该检查是否正确调用了所有 Finalize 方法(尽管可能关闭或处置),并且没有可以指向 ClassX 的静态引用。

请记住,如果未删除 ClassX,则 GC 生成的图中将可以访问 Bitmap 实例,从而不会将其从堆中删除。

我建议使用 perfmon 并添加 .Net 内存对象来查看是否有任何对象在最终确定或固定对象中幸存下来,这些是您可能对内存泄漏感兴趣的对象。

我希望它有帮助:P,但是如果你把 ClassX 的代码放在里面会更好。