2012-06-13 2 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. Как класс таблицы знает, где экземпляр TableRow и TableCell есть? Причина, почему я спрашиваю, потому что кажется, что вы не можете повторно использовать экземпляр 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

Смежные вопросы