문제

많은 무엇인가에 대해 배운 VB 에서 배운 사용하는 코드는 정적분석(특히 Aivosto 의 프로젝트 분석기).고 한 것을 확인합한지 여부의 모든 개체 배열입니다.나는 그냥 그렇게 맹목적으로 이기 때문에 아빠 이렇게 말했다.하지만 지금은 나가 알고 있는 조금 더 많은 방법에 대해 VB 릴리스 자원,그것은 이러한 일이 일어나고 자동으로 합니다.는 이 레거시 기능에서 사전 VB6,또는 이유가 있 명시적으로 설정해야 합니다 개체를 다시 아무것도 사용하여 삭제에 배열?

도움이 되었습니까?

해결책

내가 이해하는 바와 같이, 문제는 VB6 (및 전임자)이 COM에 뿌리를두고 있으며 참조 가비지 수집 시스템에 뿌리를두고 있다는 사실과 관련이 있습니다.

예를 들어, 제 3 자 도서관의 물체에 대한 추천을 선언한다고 상상해보십시오. 이 객체에는 COM 참조 수가 있습니다. 아무것도 설정하지 않으면 파괴되지는 않지만 객체의 기준 수가 0에 도달 할 때는 파괴되지 않습니다.

이제 모든 COM 구성 요소가 Visual Basic으로 작성된 것은 아닙니다. 일부는 C 또는 C ++로 작성되었습니다. 구조화 된 예외 처리는 모든 언어에 존재하지 않았습니다. 따라서 오류가 발생하면 물체의 기준 수는 제대로 줄어드는 것을 보장하지 않았으며 COM 객체는 의도했던 것보다 더 오래 걸리는 것으로 알려져 있습니다. 이것은 Visual Basic, 그 자체에 문제가되지 않았습니다. 그것은 com 문제였습니다. (그리고, .net이 참조 계산을 사용하지 않는 이유입니다.)

그렇기 때문에 Visual Basic Developers는 일상을 종료하기 전에 객체 참조를 출시하는 것에 대해 강박 관념을 얻었습니다. 당신은 당신이 할당하는 구성 요소가 후드 아래에서 어떤 구성 요소를 만들고 있는지 모릅니다. 그러나 당신이 그것에 대한 참조를 공개 할 때, 당신은 최소한 참조 수를 공개하고 있습니다. 거의 종교적 진언이되었습니다. 선언, 사용, 출시. 그것은 일을하는 방식이었습니다.

물론, 스택에서 선언 한 DeCeperencing 변수에서 Visual Basic이 더 좋거나 빠를 수 있습니다. 그러나 젠장, 나는 그 물건들이 풀려났다는 것이 분명하기를 원한다. 메모리 누출을 추적하려고 할 때 약간의 보증은 먼 길을갑니다.

다른 팁

Matt Curland, 저자 고급 비주얼 기본 6, 우리 대부분보다 시각적 기초에 대해 더 많이 알고있는 사람은 그것이 노력을 낭비한다고 생각합니다. 주로 액세스 데이터베이스 엔진을 목표로하는 COM 데이터 액세스 라이브러리 인 DAO에 대한이 견적 (p110)을 고려하십시오.

분해 코드가 열악한 또 다른 예. DAO에는 올바른 순서로 호출 해야하는 긴밀한 방법이 있으며, 객체는 올바른 순서로도 해제해야합니다 (예 : 데이터베이스 이전의 레코드 세트). 이 단일 열악한 객체 모델 동작으로 인해 모든 로컬 변수를 함수 끝에서 아무것도 설정하지 않으면 VB가 메모리를 누출한다는 오해가 발생했습니다. 이것은 잘 설계된 객체 모델에서 완전히 잘못된 개념입니다. VB는 코드에서 할 수있는 것보다 최종 하위 줄에서 변수를 더 빨리 지울 수 있으며, 참조를 명시 적으로 릴리스하더라도 변수를 확인합니다. 당신이 만드는 모든 노력은 복제됩니다.

이것을 읽었습니까? Aivosto 웹 페이지 (프로젝트 분석기 제작자)?

정적 변수를 사용하는 경우 더 이상 변수가 필요하지 않을 때 점유 한 메모리를 되 찾는 것이 중요합니다. 동적 변수를 사용하면 메모리가 절차가 끝날 때 파괴되기 때문에 메모리는 그다지 문제가되지 않습니다.

다시 말해, 평범한 비 정적 로컬 변수를 지우는 것에 대해 걱정할 필요가 없습니다.

나는 항상 그것은 좋은 연습에,당신은 무엇인지 알고하지 않는 예외 경우 할 수 있습니다 당신은 가을에 하나의 객체를 할당이 취소되지는 않습니다.해야 합 relase 에서 그들을 마지막으로 문과 그들은 지키는 사용하지 않는 모든 메모리 그렇지 않으면 실행할 수 있습으로 메모리 누수가 일어나지 않습니다.

했던 문제의 내부에는 간단한 시간을 추적 시스템 서버에 보관된 충돌,무작위로 그 주을 확인하였다는 메모리 누수 개체의했는데 자폭합니다.나의 코드를 던져지는 예외 없이 청소 후 자동으로 서버에(실제 웹 사이트 전체 서버)을 아래로 이동합니다.

예, 모든 물체를 아무것도하지 않고 최대한 많이 정리하십시오. VB6은 물건을 청소하지 않을 때 메모리 누출이있는 것으로 유명합니다. 쓰레기 수집은 VB6/VBA에서 하위 파였습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top