我只是想知道如何找出代码中的内存泄漏。 我正在处理由其他人编写的代码,并被告知它有内存泄漏。 我正在通过代码来查看它是否有内存泄漏。
以下代码是否有内存泄漏。 我需要在这里关闭SPWEB对象。
private bool isSubSite()
{
SPWeb currWeb = SPContext.Current.Web;
SPWeb rootWeb = currWeb.Site.RootWeb;
if (currWeb.ID != rootWeb.ID)
return true;
return false;
}
答案 0 :(得分:5)
不,该代码没有内存泄漏。
不,你不应该处置那些SPWeb
个对象。如果您确实处置了它们,那么当在后续请求中或在当前请求的后续位置使用这些SPWeb
对象时,它将失败。框架代码创建了SPWeb
对象,并将其分配给当前上下文负责处理它。
答案 1 :(得分:1)
编辑:对不起,我刚刚发现你已经SpContext.Current.Web
了。这是一个共享资源,因此你不应该像@Servy所指出的那样调用dispose。让框架为您解决这个问题。
您需要处置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
内部返回没有问题,因为此代码将在稍后调用dispose try...finally
块内转换为finally
代码块,从而使确保无论函数返回还是抛出异常,都会执行它。
另请注意,您不应在共享Dispose
个对象上同时调用Close
或SpWeb
。由于情况并非如此,您可以安全地打电话给他们。
答案 2 :(得分:-2)
将代码简化为:
private bool isSubSite()
{ return SPContext.Current.Web.ID != currWeb.Site.RootWeb.ID;}
无法查看您的代码以确定它是否可能是内存泄漏的来源(但上面的代码仅使用临时引用)。