4

我只是想知道如何找出代码中的内存泄漏。我正在编写由其他人编写的代码,并被告知它存在内存泄漏。我正在浏览代码以查看它是否存在内存泄漏。

以下代码是否存在内存泄漏。我需要在这里关闭 SPWEB 对象吗?

     private bool isSubSite()
    {

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

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

3 回答 3

5

不,该代码没有内存泄漏。

不,您不应该处理这些SPWeb物品。如果您确实处置它们,那么当这些SPWeb对象用于后续请求或当前请求的后续位置时,它将失败。框架代码创建SPWeb对象并将其分配给当前上下文,负责处理它。

于 2014-12-16T19:27:21.977 回答
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;
        }
    }
}

请注意,在 内部返回没有问题,因为此代码稍后将通过在块内部调用 disposeusing被转换为代码块,从而确保无论函数返回或抛出异常,它都会被执行。try...finallyfinally

另外,请注意,您不应该调用任何共享对象DisposeClose共享SpWeb对象。由于情况并非如此,您可以安全地打电话给他们。

于 2014-12-16T19:31:39.733 回答
-2

将代码简化为:

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

无法查看您的代码来确定它是否可能是内存泄漏的来源(但上面的代码仅使用临时引用)。

于 2014-12-16T19:31:02.073 回答