2010-06-01 3 views
0

Pour des raisons de débogage, je veux détruire une instance de classe qui reste comme référence. Est-ce possible? Il ne doit pas être élégant ou stable, car cela ne finira jamais dans le code de production.Puis-je détruire une instance de classe même s'il existe encore des références?

Pour clarifier:

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) 

Est-ce possible? Un moyen serait d'appeler IUnknown::Release pour diminuer manuellement le nombre de références, mais comment puis-je maintenant combien de fois je dois l'appeler?

Répondre

3

C'est une très mauvaise idée

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

Comme vous le savez, l'objet lui-même appellera Class_Terminate quand il pense que son compte de référence a obtenu à zéro, de sorte que votre suggestion d'appeler Release devrait faire l'affaire - il suffit de continuer à appeler Release jusqu'à ce que Release lui-même renvoie une erreur.

This page from Bruce McKinney's Hardcore Visual Basic suggère une façon possible que parfois il peut être possible d'obtenir le nombre de références, mais je ne pense pas que vous devez entrer dans ce schéma, à moins que (de Release ment jusqu'à ce que vous ne pouvez pas Release plus) doesn ne fonctionne pas.

« ce ne sera jamais finir dans le code de production » - prudent avec vos hypothèses, bien sûr ...

+0

Bien sûr, étant donné que cela ne Besoin d'être ultra-stable Libérer jusqu'à ce que l'erreur soit parfaite. –

+0

Le code de comptage de référence auquel vous avez lié fonctionne parfaitement, même dans VB6. Les mauvaises nouvelles: Le compilateur VB attrape les appels à la libération. Je suppose que j'ai besoin d'un autre moyen de contourner cela. –

Questions connexes