TableCell - 内存泄漏?

时间:2012-06-13 13:18:08

标签: asp.net vb.net

请查看下面的代码,该代码来自MSDN website

Sub Page_Load(sender As Object, e As EventArgs)
    ' Generate rows and cells.           
    Dim numrows As Integer = 3
    Dim numcells As Integer = 2
    Dim j As Integer
    For j = 0 To numrows - 1
        Dim r As New TableRow()
        Dim i As Integer
        For i = 0 To numcells - 1
            Dim c As New TableCell()
            c.Controls.Add(New LiteralControl("row " & j.ToString() & ", cell " & i.ToString()))
            r.Cells.Add(c)
        Next i
        Table1.Rows.Add(r)
    Next j
End Sub 'Page_Load

每行都有一个新的TableRow实例,并为每个表格单元格创建了一个新的TableCell实例。我有两个问题:

  1. 这些实例是如何被破坏的?即c = Nothing。肯定有内存泄漏?
  2. Table类如何知道TableRowTableCell的实例在哪里?我问的原因是因为看起来你不能为多个表格单元重用TableCell的实例而对多个表格行重用TableRow,即你不能做这样的事情:

    Dim objTable As New Table
    Dim objTableRow As New TableRow
    Dim objTableCell As New TableCell
    
    objTableCell.Text = "Test Row 1 Cell 1"
    objTableRow.Cells.Add(objTableCell)
    objTableCell.Text = "Test Row 1 Cell 2"
    objTableRow.Cells.Add(objTableCell)
    objTable.Rows.Add(objTableRow)
    
    objTableCell.Text = "Test Row 2 Cell 1"
    objTableRow.Cells.Add(objTableCell)
    objTableCell.Text = "Test Row 2 Cell 2"
    objTableRow.Cells.Add(objTableCell)
    objTable.Rows.Add(objTableRow)
    
    objTableCell.Text = "Test Row 3 Cell 1"
    objTableRow.Cells.Add(objTableCell)
    objTableCell.Text = "Test Row 3 Cell 2"
    objTableRow.Cells.Add(objTableCell)
    objTable.Rows.Add(objTableRow)
    

1 个答案:

答案 0 :(得分:0)

.NET有Garbage Collector为您释放内存。

  

.NET Framework的垃圾收集器管理分配和   为您的应用程序释放内存。每次创建新的   对象,公共语言运行库为对象分配内存   来自托管堆。只要地址空间可用   托管堆,运行时继续为新对象分配空间。   但是,记忆并不是无限的。最终垃圾收集器必须   执行一个集合,以释放一些记忆。垃圾   收集器的优化引擎确定执行a的最佳时间   集合,基于正在进行的分配。当垃圾   collector执行集合,它检查托管中的对象   应用程序不再使用的堆并执行   必要的操作来回收他们的记忆。

如果您需要立即释放内存(例如使用数据库连接),只要它们实现IDisposable,您就可以处置它们。

  

此接口的主要用途是释放非托管资源。   垃圾收集器自动释放分配给的内存   不再使用该对象时的托管对象。但事实并非如此   可以预测何时会发生垃圾收集。此外,   垃圾收集器不了解非托管资源,例如   窗口句柄,或打开文件和流。

     

使用此接口的Dispose方法显式释放   与垃圾收集器一起使用的非托管资源。该   当对象为no时,对象的使用者可以调用此方法   需要更长时间。