【问题标题】:Is this a memory leak这是内存泄漏吗
【发布时间】:2013-08-12 22:14:33
【问题描述】:

SrchItemEditDetail 是一个框架
PageSearchFieldEnumMV 是一个页面
下面被多次调用

private void Revise_Helper(FieldDef SearchFieldSelected, enumAndOr paramAndOr)
{
   PageSearchFieldEnumMV nextPage = new PageSearchFieldEnumMV(SearchFieldSelected, paramAndOr);
   SrchItemEditDetail.Content = nextPage;
}

其他方法用其他页面填充 SrchItemEditDetail.Content。

这是内存泄漏吗?

如果可以,我可以用

SrchItemEditDetail.Content = null;

【问题讨论】:

    标签: c# .net wpf memory-leaks


    【解决方案1】:

    这是内存泄漏吗?

    不,不是真的。以前的页面将被垃圾收集。

    如果可以,我可以用SrchItemEditDetail.Content = null; 修复它

    这没什么用。无论如何,以前的内容将变得无法访问。

    但是有潜在的问题。当框架以某种方式保留对内容页面的其他引用(例如通过事件)时,您可能会发生泄漏。

    PageSearchFieldEnumMV 持有资源时,您并没有及时释放它们。在这种情况下,或者为了安全起见,请使用:

    PageSearchFieldEnumMV nextPage = new PageSearchFieldEnumMV(...);
    
    if (SrchItemEditDetail.Content != null)
       SrchItemEditDetail.Content.Dispose();   // may need a typecast here
    
    SrchItemEditDetail.Content = nextPage;
    

    【讨论】:

    • 谢谢,.NET 怎么知道以前的页面可以被垃圾回收?需要等待 4 分钟才能接受答案。
    • 当它们变得“无法访问”时。阅读 GC 的一般工作原理。
    • 错误对象不支持 Dispose。我一般会阅读 GC。我有一些用户报告罕见的 OOM 错误,但它们在 Citrix 下,我无法重现。
    • 不是关于类型转换的评论。选择一个 PageSearchFieldEnumMV 的父类。
    • 它派生但 Page 但失败了 ((Page)SrchItemEditDetail.Content).Disose()
    猜你喜欢
    • 2011-02-20
    • 2013-01-08
    • 2013-11-12
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多