2016-08-29 2 views
1

VBScript를 사용할 때 메모리를 처리하는 가장 올바른 방법이 무엇일까 궁금합니다. 내가 사용하기 전에 모든 변수를 선언해야합니까? 프로그램의 시작인가? 전역 변수와 로컬 변수를 이해하지만 스크립트에서 모든 변수는 지역 변수입니다. 나는 시간의 99.9 %를 VBScript로 쓸 때 메모리 누수가 결코 문제가되지 않을 것이라는 것을 알고 있지만, 스크립트 내에서 메모리를 지우고 해제하는 가장 좋은 방법에 대해서도 궁금합니다. 내 말은 '최고'으로 등 (스크립트의 마지막 대를 사용하여 완료 직후에) 변수/객체를 삭제의 타이밍,변수 선언 메모리 누수

예 :

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject") 
Dim arrList : Set arrList = CreateObject("System.Collections.ArrayList") 
Dim objDict: Set objDic = CreateObject("Scripting.Dictionary") 
Dim objEmail : Set objEmail = CreateObject("CDO.Message") 

Dim someArray(), x, y, z, item 

답변

3

하고, end property)을 사용하여 명시 적 변수를 지 웁니다. 객체는 비슷하지만 제약이 추가되었습니다. VBA의 가비지 수집기와 유사하게 작동합니다. 반면 JScript는 실행 및 메모리 해제 전에 30,000 개의 개체가 범위를 벗어날 때까지 대기합니다.

암시 변수는 변수 이름 - UCase("String")의 결과와 그 Msgbox에 전달 implicitVar2를 반환 LCase(implicitVar1)에 전달 - msgbox LCase(UCase("String") 두 암시 변수를 갖는다. Explicit 변수는 DIM으로 선언되거나 과 같이 사용하여 A이라는 명시 적 변수를 만듭니다.

VBScript, on the other hand, has a much simpler stack-based garbage collector. Scavengers are added to a stack when they come into scope, removed when they go ou t of scope, and any time an object is discarded it is immediately freed.

https://blogs.msdn.microsoft.com/ericlippert/2003/09/17/how-do-the-script-garbage-collectors-work/

VBScript’s garbage collector is completely different. It runs at the end of every statement and procedure, and does not do a search of all memory. Rather, it keeps track of everything allocated in the statement or procedure; if anything has gone out of scope, it frees it immediately

https://blogs.msdn.microsoft.com/ericlippert/2004/12/22/t4-vbscript-and-the-terminator/

또한

https://blogs.msdn.microsoft.com/ericlippert/2004/04/28/when-are-you-required-to-set-objects-to-nothing/

https://blogs.msdn.microsoft.com/ericlippert/2004/03/01/syntax-semantics-micronesian-cults-and-novice-programmers/

,

CPU는 스택 기반 컴퓨터 (및 스택 기반 가상 컴퓨터 인 VBScript)입니다. CPU가 함수를 호출 할 때 호출하는 프로그램은 스택과 반환 주소에 매개 변수를 넣고 스택 프레임을 조정하고 점프를 수행합니다. callee 함수는 스택에 로컬 변수를 만들고 반환 값을 스택에 저장합니다. 리턴 할 때 스택 포인터는 원래 있던 위치로 다시 조정됩니다.

3

그것은 모범 사례가있어 모든 변수를 선언하십시오. 그러나 당신이 가정 한 이유는 아닙니다. VBScript는 자체적으로 정리 작업을 충분히 잘 수행하므로 일반적으로 메모리 누수가 문제가되지 않습니다. 대부분의 경우 객체를 놓을 필요조차 없습니다 (Set var = Nothing). 문맥을 떠날 때 자동으로 파괴되기 때문에.

여전히 변수를 선언하려는 이유는 스크립트에서 (변수 선언을 적용하는) Option Explicit을 사용하여 잘못 입력되었거나 초기화되지 않은 변수로 인한 문제를 피할 수 있기 때문입니다. Option Explicit이 없으면 VBScript는 누락 된 변수를 자동으로 만들고 빈/0 값으로 초기화합니다. 바보 같은 예 :

위 실행하면 무한 루프가 생성됩니다. 당신이 Option Explicit를 추가하는 경우 스크립트 대신 즉시 런타임 오류와 함께 종료됩니다 :

VBScript를 쓰레기 수집기가 암시 적 변수를 취소하기 위해 모든 행의 끝에서 모든 절차 ( end sub, end function의 끝에서 실행

C:\path\to\your.vbs(5, 3) Microsoft VBScript runtime error: Variable is undefined: 'fo'

+0

나는 본다. 변수를 사용하기 직전에 변수를 선언해야합니까, 아니면 맨 위에있는 변수를 즉시 선언해야합니까? – tarki

+2

보통 나는 그들이 사용되는 문맥의 시작에서 (예를 들어 스크립트, 함수, 루프 등) 변수를 선언하는 것을 선호합니다. 검색/관리가 더 쉬워집니다. –

+1

'Dim'또는 'Const'를 입력하면 그 값이 함수 나 파일의 맨 위에있는 것처럼 분석됩니다. 'A = "Hello": Dim A는 먼저 파싱됩니다. (':'는 정확히'Enter'와 동일합니다). –