2016-11-18 2 views
1

텍스트 파일을 구문 분석하는 개체가 있습니다. 여기 내 주요 프로그램 :Fortran에서 오브젝트를 올바르게 마무리하는 방법은 무엇입니까?

program main 
use Parser_class 
implicit none 
type(Parser) :: Parser 
call Parser%ProcessFile('data.txt') 
call Parser%Deallocate 
end program main 

유형 정의가 내가 마지막 키워드에 대한 읽기 및 주요 프로그램에, 또한

module Parser_class 
type :: Parser 
contains 
    procedure, public :: ProcessFile 
    final :: Deallocate 
end type Parser 
contains 
    subroutine ProcessFile(self) 
    ... 
    end subroutine 
    subroutine Deallocate(self) 
    type(Parser) :: self 
    ... 
    end subroutine 
end module Parser_class 

에 유형 정의를 변경

module Parser_class 
type :: Parser 
contains 
    procedure, public :: ProcessFile 
    procedure, public :: Deallocate 
end type Parser 
contains 
    subroutine ProcessFile(self) 
    ... 
    end subroutine 
    subroutine Deallocate(self) 
    class(Parser) :: self 
    ... 
    end subroutine 
end module Parser_class 

입니다 I 더 이상 call Parser%Deallocate이 없습니다. 이제 파이널 라이저는 언제든지 호출되지 않습니다. 나는 어쨌든 Parser 객체를 파괴하거나 겹쳐 쓰지 않기 때문에 이것을 얻는다. 그러나 어떻게 이것을 할 수 있습니까? 또는 할당 해제 프로세스를 처리하는 적절한 방법은 무엇입니까?

+0

'최종 프로그램'을 추가했습니다. 이 프로그램은 의도 한대로 작동합니다 (텍스트 파일을 읽음). 나는'call Parser % Deallocate '를 사용하는 나의 방법이 모든 배열을 할당 해제하는 올바른 방법인지 아니면 파이널 라이저로해야 하는지를 알고 싶다. 추가 질문은 finalizer가 정확히 호출 될 때입니다. 그래도 실제 예제를 제공 할 수는 없지만, 저는 O-O Fortran을 처음 접했습니다. – THo

답변

2

Fortran 2008 표준에서 마무리가 이루어질 때 4.5.6.3 에 나와 있습니다. 나는 여기에 모든 시간을 복사하지 않을 것이지만, 나는 요약 할 것이다.

명확하지 않을 때, 때로부터 다음 설명한 내용 : (예를 들어, 할당 실패) 또는 정지 STMT 실행 됨으로써, 에러 정지 화상 실행이 종료된다

경우 오류로 인해서, -stmt 또는 end-program-stmt의 경우 종료 직전에 존재하는 엔티티는 확정되지 않습니다.

이 내용은 프로그램에 적용됩니다. Parser은 프로그램 범위에 있으며 프로그램 끝 부분에 여전히 존재합니다. 최종 결정을 초래할 명백한 다른 것들은 없습니다.

Deallocate이 유형의 최종 프로 시저 인 경우 해당 유형의 객체의 종결이 유형 바인딩 절차의 호출과 다릅니다. 마무리 과정에서 프로세스는 재귀 적입니다. 구성 요소와 부모 자체가 최종 결정의 대상이됩니다. 서브 루틴 호출을 사용하면 재귀가 어떤 방식 으로든 수동으로 나타나야합니다.

대부분의 경우 엔티티가 프로그램 마지막에 확정되지 않았 음을 걱정하지 않습니다. 결국, 할당 해제는 프로그래머가 아니라 운영 체제의 문제입니다. 그러나 정돈의 다른 형태가 정말로 바람직 할 때가 있습니다.

True Finalization은 어떤면에서 강제 될 수 있습니다. 아래 목록을 살펴보면 두 가지 옵션이 고려 될 것입니다.

  • Parser 개체를 할당 가능하게 만들고 명시 적으로 할당을 해제합니다.
  • block 구조로 전체를 마무리하십시오.

마무리가 발생하면 조잡하게 요약하면 :

  • 이 해제 때 (포인터 또는 할당 가능);
  • 은 절차 개시로 intent(out) 인수로;
  • 저장되지 않은 로컬 객체에 대해 실행 가능한 구문 또는 서브 프로그램의 끝에 도달하면;
  • 변수에 대한 내장 지정 직전.
  • 함수의 결과 값이 끝난 후에.

당신이 paragraphs 5 and 7 don't exist 척하는 것이 좋습니다 문서의 최종 형태를 읽는하지 않는 경우

1.

+0

자세한 설명을 읽어 주셔서 감사합니다. 나는 내가 메모리 누수를 만들지 않기 위해 할당 한 모든 것을 항상 할당 해제해야한다는 것을 배웠다. 그것은 쓸모 없습니까? 따라서 deallocate 서브 루틴을 호출하지 않고 프로그램을 끝내는 것이 좋을까요? – THo

+1

메모리가 할당 해제 된 경우 프로그램이 끝날 때 메모리 누수가 걱정되지 않습니다. 포인터가 특정 방법으로 사용되는 경우가있을 수 있습니다 (최종적으로는 실제로 도움이 될 것입니다.) (https://stackoverflow.com/q/29038025). 할당 가능한 것들은 일반적으로 "안전하다". – francescalus

+0

@THo 가비지 콜렉션 또는 참조 횟수를 사용하는 언어에서는 더 이상 사용되지 않습니다. Fortran의 할당 가능한 변수는 count가 단 하나 일 수있는 아주 간단한 참조 계산 형식입니다. 메모리를 확보하거나 다른 것으로 다시 할당 할 필요가없는 경우 할당 가능 변수를 명시 적으로 할당 해제 할 필요가 없습니다. –

관련 문제