SharePoint代码中的内存泄漏?

时间:2014-12-16 19:23:23

标签: c# sharepoint memory memory-leaks spweb

我只是想知道如何找出代码中的内存泄漏。 我正在处理由其他人编写的代码,并被告知它有内存泄漏。 我正在通过代码来查看它是否有内存泄漏。

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

     private bool isSubSite()
    {

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

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

3 个答案:

答案 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个对象上同时调用CloseSpWeb。由于情况并非如此,您可以安全地打电话给他们。

答案 2 :(得分:-2)

将代码简化为:

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

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