繁体   English   中英

WPF / C中的内存泄漏#

[英]Memory leaks in WPF/C#

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

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

这是通过使用CreateBitmapSourceFromHBitmap加载的 - 请注意我调用DeleteHBitmap来删除此调用期间DeleteHBitmapHBitmap ,众所周知,这是我在google / etc上看到的帖子所做的

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

<code>
    ItemCollection.RemoveAt
</code>

<code>
    ItemCollection.Insert
</code>

从ListBox项集合中move图像,注意我插入时创建一个新的Class X对象以插入ListBox项集合

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

我的问题是:

我是否正确处理了BitmapSource的移动? 有什么我正在做的事情导致图像不能完全从ItemCollection删除?

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

哪个是保存图像的变量的定义ClassX ??? 问题可能在于您正在创建一个新的ClassX,并且旧的没有被GC删除,因为头部有两个不同的ClassX实例。

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

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

我建议使用perfmon并添加.Net内存对象,以查看是否有任何对象在finalize或pinned对象中存活,那些是您可能对内存泄漏感兴趣的对象。

我希望它有所帮助:P,但如果你把ClassX的代码放进去会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM