C# SharePoint代码中的内存泄漏?
我只是想知道如何找出代码中的内存泄漏。 我正在编写一个由别人编写的代码,有人告诉我它有内存泄漏。 我正在检查代码,看看它是否有内存泄漏 以下代码是否存在内存泄漏。 我是否需要关闭此处的SPWEB对象C# SharePoint代码中的内存泄漏?,c#,sharepoint,memory,memory-leaks,spweb,C#,Sharepoint,Memory,Memory Leaks,Spweb,我只是想知道如何找出代码中的内存泄漏。 我正在编写一个由别人编写的代码,有人告诉我它有内存泄漏。 我正在检查代码,看看它是否有内存泄漏 以下代码是否存在内存泄漏。 我是否需要关闭此处的SPWEB对象 private bool isSubSite() { SPWeb currWeb = SPContext.Current.Web; SPWeb rootWeb = currWeb.Site.RootWeb; if (currWeb
private bool isSubSite()
{
SPWeb currWeb = SPContext.Current.Web;
SPWeb rootWeb = currWeb.Site.RootWeb;
if (currWeb.ID != rootWeb.ID)
return true;
return false;
}
不,该代码没有内存泄漏 不,您不应该处理那些
SPWeb
对象。如果您确实处理了它们,那么当这些SPWeb
对象用于后续请求或当前请求的后续位置时,它将失败。框架代码创建了SPWeb
对象并将其分配给当前上下文,负责处理该对象。将代码简化为:
private bool isSubSite()
{ return SPContext.Current.Web.ID != currWeb.Site.RootWeb.ID;}
无法通过查看代码来确定它是否可能是内存泄漏源(但上面的代码仅使用临时引用)。编辑:抱歉,我刚刚注意到您得到了
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;
}
}
}
请注意,使用在内返回没有问题,因为此代码稍后将转换为try…finally
代码块,并在finally
块内调用dispose,从而确保无论函数返回或引发异常,都将执行此代码
另外,请注意,您不应在共享SpWeb
对象上调用Dispose
或Close
。如果不是这样的话,你可以安全地给他们打电话。SPContext.Current.Web不是一个好主意。你应该删除这个,它现在被标记为可接受的答案,你刚刚毁了poor@user388969的一天。好吧,在他接受它作为答案之前,我用正确的信息编辑了它。所以我不知道我是怎么毁了他的日子的,对不起。如果是我的话,我会把@Servy的答案标记为这个问题的答案,因为他在我面前正确地回答了这个问题。但是,很明显,我不能选择它。这并不能回答代码是否存在漏洞的问题,也不能提供任何形式的解释。