2012-03-17 11 views
10

필자는 필자의 노력을 안내하기 위해 온라인에서 찾은 튜토리얼을 사용하여 레지스트리와 상호 작용하는 코드를 델파이 프로젝트에 추가했습니다. 내가 본 모든 예는 레지스트리 액세스를 위해이 구조를 사용하는 것 같다Delphi 변수가 초기화되지 않았을 수 있습니다. 경고

var 
    Registry: TRegistry; 
begin 
    try 
    Registry := TRegistry.Create; 
    //additional code to access and use the registry object could go here 
    finally 
    Registry.Free; 
end; 

하지만 그 구조 다음 내 코드를 구현할 때, 나는 나의 변수 레지스트리 라인에 초기화되지 않았을 수 있습니다 경고를 얻고있다 여기서 TRegistry 객체를 해제합니다.

그래서 제가 발견 한 예제가 레지스트리에 액세스하는 올바른 방법에 잘못되었는지 궁금합니다. Create를 수행하는지 여부와 관계없이 내 TRegistry 객체에서 Free를 호출하고 경고를 무시해야합니까? 다시 말해, 내 try/finally 블록은 성공적인 생성자 호출 후에 코드 을 둘러싸고 야하지만 작성 호출을 감싸지 않아야합니까? 다른 것?

답변

22

코드에서 이 예외를 발생 시키면 Registry 변수가 할당되지 않습니다. 따라서 결국 마침내 초기화되지 않은 변수에 액세스하려고 시도합니다.

코드를 작성하는 올바른 방법은 try/finally 블록을 입력하기 전에 변수가 할당되어 있는지 확인하는 것입니다.

Registry := TRegistry.Create; 
try 
    //additional code to access and use the registry object could go here 
finally 
    Registry.Free; 
end; 

이것은 델파이 코딩의 가장 기본적인 수명 관리 패턴이며 근육 기억에 깊이 관여해야합니다.

생성자가 실패하면 예외를 전파하기 전에 부분적으로 구성된 객체를 정리합니다. 이 코드의 새 오브젝트 참조 Registry은 생성자가 성공적으로 완료된 경우에만 지정됩니다.

실제로 발견 한 예제가 실제로 위의 코드에서 작성되었으므로 그 코드를 잘못 복사했기를 바랍니다. 질문에 따라 작성된 것이라면 분명히 오류가 있습니다.

+0

실제로 try 블록을 만들기 전에 Create 후에 추가 검사를해야 레지스트리를 초기화 할 수 있습니까? –

+0

그리고 예를 들어, http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=656&lngWId=7 내가 찾은 튜토리얼 중 하나 일 것입니다. 실제로는 틀린 것처럼 보입니다. 그러므로 그 코드가 실제로는보다 진보 된 델피 개발자가 할 수있는 것과 유사한지를 시도하고 이해하는 질문. –

+0

분명히 그 사이트보다 더 나은 출처를 찾아야합니다! –

관련 문제