我有以下课程:
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立即收集内存?
答案 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。无限循环可能是你担心的原因。