2010-06-01 44 views
0

由於調試的原因,我想銷燬仍然作爲參考的類實例。那可能嗎?它不一定是優雅或穩定的,因爲這永遠不會在生產代碼中結束。即使仍有引用,我可以銷燬一個類實例嗎?

澄清:

Public Sub Main 
    Dim o as MyClass 
    Set o = New MyClass //o is created, one reference 
    DestroyObject o  //Class_Terminate is called and the object destroyed 
    //Further code, not using o 
End Sub     //Possible runtime error here (don't care) 

這可能嗎?一種方法是致電IUnknown::Release手動減少參考計數,但我現在該如何經常調用它?

回答

3

這是一個非常糟糕的主意

Option Explicit 

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 

Private m_oRef As Class1 

Private Sub Command1_Click() 
    Dim o As Class1 

    Set o = New Class1 
    Set m_oRef = o 
    DestroyObject o 
    ' releasing m_oRef after this point will bring down the IDE ' 
End Sub 

Private Sub DestroyObject(pArg As Object) 
    Dim lRefCount  As Long 
    Dim lIdx   As Long 
    Dim pUnk   As IUnknown 

    lIdx = ObjPtr(pArg) + &H20 
    Call CopyMemory(lRefCount, ByVal lIdx, 4) 
    For lIdx = 1 To lRefCount - 2 
     Call CopyMemory(pUnk, pArg, 4) 
     Set pUnk = Nothing 
    Next 
    Set pArg = Nothing 
End Sub 
1

如你所知,對象本身將調用Class_Terminate當它認爲它的引用計數已經得到了零,所以您的通話Release應該做的伎倆的建議 - 只要保持通話Release直到Release本身拋出一個錯誤。

This page from Bruce McKinney's Hardcore Visual Basic提出一種可能的方式,這可能有時可能得到的引用計數,但我不認爲你需要進入,除非這個計劃(的Release ING直到你不能Release沒有更多)沒有按沒有工作。

「這永遠不會在生產代碼落得」 - 小心你的假設,當然,...

+0

當然,因爲這不需要超穩定釋放,直到錯誤完全正常。 – 2010-06-01 07:48:27

+0

您鏈接到的引用計數代碼完美工作,即使在VB6中。壞消息:VB編譯器捕獲到Release的調用。我想我需要另一種解決方法。 – 2010-06-01 08:00:51

相關問題