title: How to dispose these objects?
body: <p>The project I'm maintaining has a bunch of usercontrols where SPWeb and SPSite objects are initialized in the constructor from SPContext. These objects are then passed to other classes. </p>
  
  <pre><code>public MyUserControl : UserControl
  {  
  private SPWeb web;
  public MyUserControl() { web = SPContext.Current.Web; }
  AnotherClass.SomeMethod ( web );
  }
  </code></pre>
  
  <p>The logs are filled with the following two entries:</p>
  
  <p>1)</p>
  
  <pre><code>Detected use of SPRequest for previously closed SPWeb object.  Please close SPWeb objects when you are done with all objects obtained from them, but not before.  Stack trace:   
   at Microsoft.SharePoint.SPListItemCollection.EnsureListItemsData()    
   at Microsoft.SharePoint.SPListItemCollection.GetEnumerator()    
   at XXXXXXXX.Web.UserControls.TopNavigation.LoadTopImage()    
   at XXXXXXXX.Web.UserControls.TopNavigation.OnLoad(EventArgs e)    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
   at System.Web.UI.Page.ProcessRequest()    
   at System.Web.UI.Page.ProcessRequest(HttpContext context)    
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()    
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)    
   at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)    
   at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)    
   at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
  </code></pre>
  
  <p>2) </p>
  
  <pre><code>An SPRequest object was not disposed before the end of this thread.  To avoid wasting system resources, dispose of this object or its parent (such as an SPSite or SPWeb) as soon as you are done using it.  This object will now be disposed.  Allocation Id: {444DCCA1-C2F6-493D-9D02-D04F75C6E384}  This SPRequest was allocated
   at   
   at Microsoft.SharePoint.Library.SPRequest..ctor()    
   at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite site, String name, Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous)    
   at Microsoft.SharePoint.SPWeb.InitializeSPRequest()    
   at Microsoft.SharePoint.SPWeb.InitWebPublic()    
   at Microsoft.SharePoint.SPWeb.get_LanguageCulture()    
   at Microsoft.SharePoint.SPWeb.get_Title()    
   at XXXXXXXXX.DataAccessUtility.&lt;&gt;c__DisplayClassc.&lt;GetSitesTopNav&gt;b__8()    
   at Microsoft.SharePoint.SPSecurity.&lt;&gt;c__DisplayClass4.&lt;RunWithElevatedPrivileges&gt;b__2()    
   at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)    
   at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)    
   at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)    
   at XXXXXXXX.GetSitesTopNav(SPSite site, SPWeb Currentweb, String userName)    
   at XXXXXXXX.Web.UserControls.TopNavigation.PopulateSiteSelection()    
   at XXXXXXXX.Web.UserControls.TopNavigation.OnLoad(EventArgs e)    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Control.LoadRecursive()    
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
   at System.Web.UI.Page.ProcessRequest()    
   at System.Web.UI.Page.ProcessRequest(HttpContext context)    
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()    
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)    
   at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)    
   at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)    
   at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)    
   at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
  </code></pre>
  
  <p>Is passing the url obtained from SPContext.Current.Web.Url the right way? Any suggestions?</p>