【问题标题】:How to write a destructor for a class?如何为类编写析构函数?
【发布时间】:2015-08-01 13:57:54
【问题描述】:

我有以下课程:

public class test
{
       public int datacapturecount { get; set; }
       public int sno { get; set; }
       public string name { get; set; }
       public string sourceaddr { get; set; }
       public string destaddr { get; set; }
       public string Bssid { get; set; }
       public string packetsubtype { get; set; }
       public UInt16 datarate { get; set; }
       public SByte signal { get; set; }
       public UInt32 channel { get; set; }
       public UInt32 size { get; set; }
}

我在无限循环中向 wpf datagrid 添加行时正在使用这个类:

for(I=0; ; I++)
{
    datagrid.Items.Add(new test() {
        datacapturecount = 0, 
        sno = I,
        name = "ssss",
        sourceaddr = "44545454"
    }); 
}

这里的类测试是创建多个实例并导致内存泄漏。如何避免这种情况? 如何为上述类编写析构函数,以便在将行添加到数据网格后立即强制 GC 收集内存?

【问题讨论】:

    标签: c# .net wpf memory-leaks datagrid


    【解决方案1】:

    那里没有内存泄漏。只是您试图向DataGrid 添加无限数量的行。在此之前或之后,您将耗尽内存。

    for(I=0; ; I++)
    

    没有检查结束for循环:

    for(I=0; I < 100; I++)
    

    这将尝试添加 100 行。

    【讨论】:

      【解决方案2】:

      没有内存泄漏。每个类实例都被添加到datagrid.Items,因此在您保留对datagrid.Items 的引用时,对test 实例的引用必须保留在内存中。因为您在添加项目时有一个无限循环,所以代码将一直运行,直到内存不足。

      向此类添加析构函数或IDisposible 不会产生任何影响。您需要管理添加到datagrid.Items 的项目数量。

      【讨论】:

      • 感谢您的建议
      【解决方案3】:

      如前面的答案所述,您的代码不会导致任何内存泄漏。

      如果您仍想为您的类添加析构函数(出于其他原因),您可以通过将以下内容添加到您的类中来实现。

      ~test()
      {
          // Do whatever cleanup you find necessary.
      }
      

      【讨论】:

      • 我不确定为什么这被否决了,因为问题中的标题清楚地写着“如何为类编写析构函数?”这正是我要回答的问题。
      【解决方案4】:

      如何为类添加析构函数

      何时实施 IDispose

      如果您有任何已实现 IDispose 接口的类变量,您应该实现IDisposable pattern。简单来说,如果您有任何具有 Dispose 方法的类变量,您应该实现 IDispose 接口并 Dispose 所有一次性对象。

      何时实现终结器(析构函数)

      只有当你的类中有任何非托管资源时,你才应该实现终结器(或析构函数)。有关更多详细信息,请参见上面的 msdn 页面。 如果您没有任何非托管资源,则不应实施终结器。因为,拥有终结器会导致这些实例在内存中停留更长时间。事实上,它会在内存中停留两个 GC 周期。第一个 GC 周期将其添加到 CLR 终结队列中,第二个 GC 周期实际上会处理它。这就是为什么您在手动调用 Dispose 方法时抑制完成。

      返回您的代码

      显然,您的测试类中没有任何可用的 Disposable 类变量。因此,您根本不必在这个 Test 类中实现 IDisposable。无限循环可能是您担心的原因。

      【讨论】:

        猜你喜欢
        • 2018-08-16
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        相关资源
        最近更新 更多