如何为类编写析构函数?

时间:2015-05-20 10:57:28

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

我有以下课程:

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"
    }); 
}

这里的类测试正在创建多个实例并导致内存泄漏。怎么避免这个? 如何为上面的类编写析构函数,以便我可以在将行添加到datagrid后强制GC立即收集内存?

4 个答案:

答案 0 :(得分:4)

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

向此类添加析构函数或IDisposible将不起作用。您需要管理添加到datagrid.Items的项目数。

答案 1 :(得分:2)

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

DataGrid

没有检查结束for(I=0; ; I++) 周期:

for

这将尝试添加100行。

答案 2 :(得分:0)

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

如果您仍想在课堂上添加析构函数(出于其他原因),可以在课程中添加以下内容。

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

答案 3 :(得分:0)

如何为类添加析构函数

何时实施IDispose

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

何时实施Finalizer(析构函数)

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

返回您的代码

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