2013-06-04 286 views
2

我看到這段代碼是別人寫的:是否需要註銷事件處理程序?

public class DynamicPageContent : IHttpModule 
    { 
     public void Dispose() { } 

     public void Init(HttpApplication context) 
     { 
      // it is necessary to 
      context.BeginRequest += new EventHandler(DynamicPageContent_BeginRequest); 
     } 
     //actual handler not pasting as it's meaningless for this question 
} 

正如你所看到的處理程序註冊,但從來沒有註銷。這不會造成內存泄漏?

+2

簡單 - 是的。考慮[這個答案](http://stackoverflow.com/a/621177/1283124),假設'DynamicPageContent_BeginRequest'是一個實例方法。並非所有人都同意,他實際上是一個內存泄漏(這在某種程度上與C++泄漏不同),但作爲一般規則,您應該取消訂閱,以便GC可以收集對象。 –

+1

@IlyaIvanov:in * theory * should not,imo。由於模塊在App啓動時創建一次(就我所知),並且在請求管理期間始終提供* same *實例。所以這*不應該*產生任何內存泄漏,imo。 – Tigran

+0

@Tigran抱歉,單方面和快速提示:我們能否就我們對內存泄露實際上的定義達成一致?維基有一個非常通用的定義,因爲*錯誤地管理內存分配*,我同意 –

回答

2

事件處理可能會造成泄漏,但只能在特定條件下進行。

需要注意的是訂閱對象比發佈對象具有更大的生命週期。

要注意的是當發佈對象的壽命比訂閱對象更大時。

在這種情況下,它們看起來是同一個對象,那麼取消訂閱就沒有必要或沒用。這隻會混淆你的代碼。

+0

+1正確。在目前情況下,這不應該爲程序產生任何問題,或者就未使用和不可用的內存部件而言,會產生泄漏*。在HTTP處理管道中總是會引用模塊的* same *實例,並且如果程序「死掉」所有模塊*應該「死掉」它。 – Tigran

+0

@Tigran - 是的,這是一個'全球'實例是另一個說法。 –

相關問題