Могу ли я уничтожить экземпляр класса, даже если есть ссылки? - PullRequest
0 голосов
/ 01 июня 2010

По причинам отладки я хочу уничтожить экземпляр класса, который все еще в качестве ссылок. Это возможно? Это не должно быть элегантно или стабильно, потому что это никогда не закончится в рабочем коде.

Для уточнения:

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, чтобы вручную уменьшить счетчик ссылок, но как теперь узнать, как часто я должен вызывать его?

Ответы [ 2 ]

3 голосов
/ 01 июня 2010

Это очень плохая идея

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 голос
/ 01 июня 2010

Как вы знаете, сам объект будет вызывать Class_Terminate, когда он думает, что его счетчик ссылок достиг нуля, поэтому ваше предложение о вызове Release должно сработать - просто продолжайте вызывать Release до самого Release выдает ошибку.

На этой странице из Hardcore Visual Basic Брюса МакКинни предлагается один из возможных способов получения подсчета ссылок, но я не думаю, что вам нужно в этом разбираться, если только эта схема (из Release пока ты не сможешь Release не более) не работает.

«это никогда не закончится в производственном коде» - конечно, будьте осторожны с вашими предположениями ...

...