문제

나는 항상 객체 작업이 끝나면 객체를 아무것도 설정하지 않는 것이 좋습니다라는 것을 읽었습니다.하지만 저는 보통 폼 내부의 함수에만 사용합니다.

객체를 Nothing으로 설정해도 함수 범위를 벗어나면 참조가 손실되고 메모리가 해제되지 않나요?

즉.정말 해야 하는 일인가요?

Set db = Nothing
Set record_set = Nothing
도움이 되었습니까?

해결책

VB는 소위 "기준 계수"쓰레기 수집기를 사용합니다.

기본적으로 변수가 범위를 벗어나면 참조 된 객체의 참조 카운터가 줄어 듭니다. 객체 참조를 다른 변수에 할당하면 참조 카운터가 증가합니다.

카운터가 0에 도달하면 물체가 쓰레기 수집 준비가되었습니다. 이런 일이 발생하자마자 객체 리소스가 릴리스됩니다. 함수 로컬 변수는 참조 수가 1보다 높지 않은 객체를 참조 할 가능성이 높으므로 함수가 끝나면 객체 자원이 해제됩니다.

변수를 설정합니다 Nothing 참조 카운터를 명시 적으로 줄이는 방법입니다.

예를 들어 파일을 읽고 파일 객체 변수를 다음으로 설정합니다. Nothing 바로 다음 ReadAll() 전화. 파일 핸들은 즉시 릴리스되며 내용을 시간에 시간을 할애 할 수 있습니다.

당신이 설정하지 않으면 Nothing, 파일 핸들은 절대적으로 필요한 것보다 더 오래 열릴 수 있습니다.

"귀중한 자원을 차단 해제 해야하는"상황에 있지 않은 경우 변수가 범위를 벗어나게하는 것은 괜찮습니다.

다른 팁

쓰레기 수집은 거의 완벽하지 않습니다. .NET에서도 시스템이 쓰레기 수집을 일찍 수행하도록 프롬프트 할 때가 있습니다.

이런 이유로 나는 둘 다 명시 적으로 둘 다 닫다 그리고 설정 아무것도 아님 내가 그들과 함께 끝났을 때 레코드 세트.

"에 대한 도움말 항목의 마지막 줄레코드세트.닫기" Microsoft DAO 도움말 및 Access Developer Reference의 내용은 다음과 같습니다.

"가까운 방법에 대한 대안은 객체 변수의 값을 아무것도 아닌 것으로 설정하는 것입니다 (set dbstemp = nothing)."

http://msdn.microsoft.com/en-us/library/bb243098.aspx

이를 염두에 두고, 이 기사 "DAO(Data Access Objects)를 사용한 후 데이터베이스 팽창을 방지하는 방법"이라는 제목의 Microsoft 기술 자료에는 데이터베이스가 팽창하지 않도록 하려면 명시적으로 닫아야 한다고 나와 있습니다.기사의 세부 사항이 약간 모호하다는 것을 알 수 있습니다."원인" 섹션은 거의 횡설수설할 정도로 불분명합니다.

http://support.microsoft.com/kb/289562

증상:DAO (Data Access Object) (DAO)를 구현하여 레코드 세트를 열면 Microsoft Access 데이터베이스가 부풀어 오르거나 빠르게 성장하기 시작했습니다.

원인:레코드 세트 코드를 통해 루프 할 때마다 레코드 세트의 메모리를 해제하지 않으면 DAO는 더 많은 메모리를 사용하고 데이터베이스 크기를 늘릴 수 있습니다.

추가 정보:를 만들 때 레코드 집합(또는 QueryDef) 개체 코드, 다음과 같은 경우 명시적으로 개체를 닫습니다. 완료되었습니다.마이크로소프트 액세스 레코드 집합을 자동으로 닫고 QueryDef 객체 상황.그러나 에서 객체를 명시적으로 닫습니다. 코드를 사용하면 가끔 피할 수 있습니다. 개체가 남아 있는 경우의 경우 열다.

마지막으로, 저는 15년 동안 Access 데이터베이스로 작업해 왔으며 거의 ​​항상 Close 메서드를 명시적으로 사용하지 않고 로컬로 선언된 레코드 집합 변수가 범위를 벗어나도록 허용했습니다.나는 그것에 대해 어떤 테스트도 수행하지 않았지만 그것은 중요하지 않은 것 같습니다.

변수가 범위를 벗어나면 참조를 정리해야합니다. 아마도 이것은 이후 버전의 소프트웨어로 개선되었지만 한 번은 신뢰할 수 없었습니다. 나는 변수를 "아무것도"로 명시 적으로 설정하는 것이 좋은 관행이라고 생각합니다.

ASP Classic (Server-Side Scripting)을 사용하는 경우 [Virtual] 서버가 종료 될 때까지 범위를 벗어나지 않기 때문에 모든 객체를 사용하지 않을 때 모든 객체를 아무것도 설정하지 않도록 가져 오는 것이 가져옵니다.

이러한 이유로, 모든 MS VB 스크립팅 예제는 항상 객체가 닫히고 아무것도 설정되지 않았다는 것을 보여주었습니다. 스크립트 발췌 부분은 객체가 범위를 벗어나지 않은 ASP Classic과 같은 환경에서 사용될 수 있습니다.

드물게 객체가 범위를 벗어나지 않는 장기 실행 프로세스를 코딩하려는 다른 상황은 거의 없으며, 개체를 명시 적으로 해제하지 않으면 물리적 메모리가 부족하다는 것을 알게됩니다.

다른 이유 때문에 ASP 클래식을 코딩하거나 글로벌 범위에서 프로세스를 실행하는 것을 발견하면 예, 객체를 명시 적으로 릴리스해야합니다.

나는 보통 절차가 끝날 때 항상 이것을 넣거나 모듈 레벨을 사용하는 경우 "CloseEcordset"서브를 호출합니다.

Private Sub Rawr()
On Error GoTo ErrorHandler

    'Procedural Code Here.

    ExitPoint:
        'Closes and Destroys RecordSet Objects.
        If Not Recset Is Nothing Then
            If Recset.State = 1 Then
                Recset.Close
                Conn.Close
            End If
            Set Recset = Nothing
            Set Conn = Nothing
        End If
        Exit Sub

    ErrorHandler:
        'Error Handling / Reporting Here.
        Resume ExitPoint
End Sub

그러나 그렇게하면 절차가 끝나고 (정상적으로 또는 오류로 인해) 물체가 정리되고 리소스가 무료입니다.

그런 식으로 그렇게하는 것은 당신이 그것을 때릴 수 있다는 점에서 매우 안전합니다. 그리고 그것은 닫는 것과 관련하여 필요한 일만 수행하거나 레코드 세트 / 연결 객체를 이미 닫았는 경우 (런타임 오류 또는 런타임 오류로 인해 런타임 오류 또는 나중에 일찍 닫아야합니다. 이것은 단지 확인합니다).

프로그램에서 일어나는 일에 관계없이 즉시 자원을 확보하기 위해 마무리를 마치면 객체를 정리하는 것이 정말 번거롭지 않으며 항상 최선을 다합니다.

이 시도

If Not IsEmpty(vMyVariant) Then
    Erase vMyVariant
    vMyVariant = Empty
End If
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top