2014-12-16 6 views
4

Мне просто интересно, как узнать утечку памяти в коде. Я работаю над кодом, написанным кем-то другим, и ему сказали, что он имеет утечку памяти. Я просматриваю код, чтобы узнать, есть ли у него утечка памяти.Утечка памяти в коде SharePoint?

. Следующий код есть память утечка. Мне нужно закрыть объекты SPWEB здесь.

 private bool isSubSite() 
    { 

     SPWeb currWeb = SPContext.Current.Web; 
     SPWeb rootWeb = currWeb.Site.RootWeb; 

     if (currWeb.ID != rootWeb.ID) 
      return true; 
     return false; 
    } 

ответ

1

Редактировать: Извините, я только что заметил, что вы получаете SpContext.Current.Web. Это общий ресурс, и вы не должны называть его dispose, как указано @Servy. Пусть рамки позаботятся об этом для вас.


Вам необходимо избавиться от объектов SPWeb. Вы можете либо позвонить Dispose себя после того, как вы больше не нуждаетесь в них, или вы можете использовать using заявление, которое автоматически распоряжается объект для вас:

private bool isSubSite() 
{ 

    using (SpWeb currWeb = SpContext.Current.Web){ 
     using (SPWeb rootWeb = currWeb.Site.RootWeb){ 

      if (currWeb.ID != rootWeb.ID) 
       return true; 
      return false; 
     } 
    } 
} 

Обратите внимание, что не существует никаких проблем возвращения внутри using, так как этот код будет переведен в блок кода try...finally позже с вызовом, который должен быть расположен внутри блока finally, таким образом, он будет выполнен независимо от возвращаемой функции или отброшенных исключений.

Также обратите внимание, что вы не должны называть ни Dispose, ни Close на общих SpWeb объектах. Поскольку это не так, вы можете безопасно их называть.

+2

Disposing SPContext.Current.Web - отличная идея. –

+1

Вы должны удалить это, теперь оно помечено как принятый ответ, и вы только что испортили плохой день @ user388969. –

+0

Ну, я отредактировал его с правильной информацией, прежде чем он принял его в качестве ответа. Поэтому я не знаю, как я испортил его день, извините. Если бы это был я, я бы назвал ответ @Servy ответом на вопрос, потому что он правильно ответил на это передо мной. Но, очевидно, я не могу это выбрать. –

5

Нет, этот код не имеет утечки памяти.

Нет, вы не должны избавляться от этих SPWeb объектов. Если вы их уничтожаете, тогда, когда те объекты SPWeb используются при последующих запросах или в последующих местоположениях текущего запроса, он будет терпеть неудачу. Код структуры, созданный объектом SPWeb и назначенный ему текущему контексту, несет ответственность за его удаление.

-2

Упростить код на:

private bool isSubSite() 
    { return SPContext.Current.Web.ID != currWeb.Site.RootWeb.ID;} 

Нет пути от глядя на свой код, чтобы определить, может ли это быть источником утечки памяти (но выше код использует только временные ссылки).

+1

Это не отвечает на вопрос о том, имеет ли код утечку и не дает какой-либо формы объяснения. – Servy