2010-06-01 2 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

아시다시피 그것의 참조 카운트가 0에 도착했다 생각, 그래서 트릭을 할해야 Release를 호출하여 제안 할 때, 개체 자체가 Class_Terminate를 호출합니다 - 단지 자체가 오류가 발생 ReleaseRelease 때까지 계속 전화.

This page from Bruce McKinney's Hardcore Visual Basic는 때때로 참조 카운트를 얻을 수있을 것으로 하나의 가능한 방법을 제안,하지만 난 당신이 계획하지 않는 한 케이 (당신은 더 이상하지 Release 수까지 Release ING의)이 들어갈 필요가 있다고 생각하지 않습니다 일하지 마라.

"이 생산 코드에 끝이 없을 것"- 물론 당신의 가정, 조심 ...

+0

이며,이 없기 때문에 매우 안정적이어야합니다. 오류가 완전히 해결 될 때까지 해제하십시오. –

+0

VB6에서도 링크 된 참조 카운트 코드가 완벽하게 작동합니다. 나쁜 소식 : VB 컴파일러는 Release를 호출합니다. 이 문제를 해결하려면 다른 방법이 필요합니다. –

관련 문제