none
程序中的物件變數 RRS feed

  • 問題

  • 如果在一個程序中建立了物件變數(Dim Obj As New Object),但在程序結束前,沒有設為 Nothing(Set Obj = Nothing),那麼,會否有不良後果(例如會否令一些記憶體無法被釋放)?

    謝謝!

     

    2006年6月29日 下午 04:45

解答

  • Win32 Programming是需要手動清除建立的Objects. NET Framework提供了Automatic Garbage Collection的機制, 就算不小心忘記清除不需要的object, NET也會自動幫你清除的.

     

    2006年6月30日 上午 02:05

所有回覆

  • Win32 Programming是需要手動清除建立的Objects. NET Framework提供了Automatic Garbage Collection的機制, 就算不小心忘記清除不需要的object, NET也會自動幫你清除的.

     

    2006年6月30日 上午 02:05
  • 最好是明白釋放,不要等系統幫你釋放,不然有可能會有 performance issue 或是效率不彰的問題,雖然 Garbage Collector 會幫你收集,但是明白指示釋放物件是個好的習慣 .
    2006年6月30日 上午 09:07
    版主
  • 因為有 Set ,所以我想應該是 VB6 吧。

    VB6 在生命週期結束後就會自動作 Set Obj = Nothing (減少參照數)

    直到參照數 = 0 後,這邊就會清。

    若是參照數沒歸 0 ,這個變數物件就會一直被綁注,直到應用程式結束的時候在自動一起清。所以有些寫得很混的程式,結束的時候會等比較久,才整個關閉。VB.NET 在物件處理的效能比 VB6 快 4 倍以上,就比較不明顯。

    註:

    Dim Obj1, Obj2, Obj3 As Object

    Set Obj1 = New xxx

    Set Obj2 = Obj1

    Set Obj3 = Obj2

    xxx實體位置假定以 add 代表,當 Obj1 建立時,add 的參照數 = 1

    Obj2 參照 Obj1 時,add 的參照數 = 2

    Obj3 參照 Obj2 時,add 的參照數 = 3 ,注意,物件變數是參照實體變數,所以不會記在 Obj2 上,而是記在 add 上。

    當 Set Obj2 = Nothing 時,Obj1, Obj3 仍然參照 add ,所以參照數 = 2

    以此類推。

    若 Obj1, Obj2, Obj3 分別在不同區域宣告時,例如全域變數、類別內私有變數、模組內變數,且無手動設定 Set Obj = Nothing ,則屬於前面敘述所言。

    詳細說明請參考 MSDN 大標 Automation 章節,欲取得物件參照數,可參考 oleaut32.dll 內的函數。

    2006年6月30日 下午 03:46
    版主
  • 如果在生命週期結束時,VB會自動將清除參照數目,那麼,在如下程序中,則不用自行清除(Set Obj = Nothing)了,是不是?因為程序結束時(End Sub 那行執行後),Obj 的生命週期亦已完結:

    Sub Test

    Dim Obj As New Object

        Obj.DoSomething

    End Sub

     

     

    2006年7月1日 下午 01:45
  • 是的。

    但是記憶體釋放會在 Class / Form Unload 時才觸發。

    若是寫在 Module 的話,則在 App End 時才觸發。

    2006年7月1日 下午 02:57
    版主