Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SharePoint代码中的内存泄漏?_C#_Sharepoint_Memory_Memory Leaks_Spweb - Fatal编程技术网

C# SharePoint代码中的内存泄漏?

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

我只是想知道如何找出代码中的内存泄漏。 我正在编写一个由别人编写的代码,有人告诉我它有内存泄漏。 我正在检查代码,看看它是否有内存泄漏

以下代码是否存在内存泄漏。 我是否需要关闭此处的SPWEB对象

     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的答案标记为这个问题的答案,因为他在我面前正确地回答了这个问题。但是,很明显,我不能选择它。这并不能回答代码是否存在漏洞的问题,也不能提供任何形式的解释。