2012-06-13 65 views
0

請看看下面的代碼,這是我從MSDN website採取:TableCell - 內存泄漏?

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) 
    

回答

0

.NET有Garbage Collector是爲你釋放記憶。

.NET Framework的垃圾回收器管理您的應用程序的內存分配和 版本。每次創建新對象時,公共語言運行庫都會從託管堆爲對象 分配內存。只要地址空間在託管堆中可用,運行時就會繼續爲新對象分配空間。 但是,記憶不是無限的。最終垃圾收集器必須執行一個集合以釋放一些內存。垃圾收集器的優化引擎根據所做的分配確定執行收集的最佳時間。垃圾收集器執行收集時,會檢查應用程序不再使用的受管理的 堆中的對象,並執行必要的操作以收回其內存。

如果您需要立即釋放內存(如與數據庫連接),你可以處理他們,只要他們實現IDisposable

此接口的主要用途是釋放非託管資源。 當不再使用該對象時,垃圾收集器會自動釋放分配給被管對象的內存。但是,並不是 可以預測垃圾回收何時發生。此外,垃圾收集器不知道非託管資源,如 窗口句柄或打開文件和流。

使用此接口的Dispose方法與垃圾回收器一起顯式釋放 非託管資源。當對象不再需要 時,對象的消費者可以調用此方法。

+0

我意識到,但根據我的經驗,總是值得儘可能地管理內存。我在.NET應用程序中遇到內存泄漏問題。 – w0051977

+0

.NET不允許你像在C++/COM中一樣輕鬆地管理內存。根據我的經驗,.NET內存泄漏與不丟棄一次性對象直接相關。 – jrummell

+0

你是說這樣做毫無意義? tc = Nothing – w0051977