이것은 끔찍한 혼란처럼 들립니다. 나는 당신이 다음과 같은 것을 가지고 있다고 가정합니다.
program really_bad
implicit none
integer, dimension(:), pointer :: a
integer, dimension(:), allocatable, target :: b
logical :: point_to_b
allocate(b(10))
write(*, *) "Should I point to B?"
read(*, *) point_to_b
if (point_to_b) then
a => b
else
allocate(a(10))
end if
! Destroy A
end program really_bad
그리고 당신의 문제는 파괴적인 부분입니다. a
이 b
을 가리키는 경우 NULLIFY
으로 지정해야합니다. b
을 유지해야하기 때문입니다. 그러나 a
이 b
을 가리키고 있지 않으며 사용자가 NULLIFY
인 경우 메모리 누수가 발생합니다.
@ ian-bush는 어떤 것이 다른 것과 연관되어 있는지 확인할 수는 있지만 가능한 모든 대상과 포인터를 비교해야한다는 것을 의미하며 그 중 많은 수가 있다고 주장 할 수 있습니다.
시도해 볼 수있는 한 가지 방법은 생각보다 나쁘지만 할당을 해제하고 더미 인수를 STAT=
사용하여 할당 해제가 실제로 작동하는지 확인하는 것입니다. 이 끔찍한 해킹주의, 나는 단지 그것을 GFortran에, 인텔에서 작동하지있어, 그러나 여기 간다하시기 바랍니다 아무것도 :
program don
implicit none
integer, dimension(:), pointer :: a
integer, dimension(:), target, allocatable :: b
logical :: point_to_b
integer :: stat
b = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
write(*, *) "Should I point to B?"
read(*, *) point_to_b
if (point_to_b) then
a => b
else
allocate(a(10))
end if
deallocate(a, stat=stat)
if (stat /= 0) nullify(a)
end program don
훨씬 더 나은 방법 아마 유형의 배열 포인터를 대체하는 것 그 포인터와 플래그가 둘 다 연관되어 있어야합니다.
program don
implicit none
type :: my_array_pointer_type
integer, dimension(:), pointer :: array
logical :: master
end type my_array_pointer_type
type(my_array_pointer_type) :: a
integer, dimension(:), target, allocatable :: b
logical :: point_to_b
integer :: stat
allocate(b(10))
b = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
write(*, *) "Should I point to B?"
read(*, *) point_to_b
if (point_to_b) then
a%master = .false.
a%array => b
else
a%master = .true.
allocate(a%array(10))
end if
if (a%master) then
deallocate(a%array)
else
nullify(a%array)
end if
end program don
당신이 다음 a
또 다른 포인터를 가리킨 다음 파괴 시도 할 수있는 경우 이러한 제안 중 어느 것도 도움이됩니다. 이 경우 전체 프로젝트 설계를 다시 생각해 보라고 제안합니다.
"코드 끝에"얼마나 가까이에 의미합니까? 실행하는 동안 나는 메모리 누출 등을 신경 쓸 수도 있지만, 프로그램이 끝나면 모든 것이 정리되도록하는 것이 더 이상 나의 책임이 아니다. – francescalus
나는 당신이 무슨 뜻인지 이해할 수 없다. 분명히 나는 프로그램이 종료되기 전에 할당 해제 된 모든 메모리를 목표로해야만한다. –
나는 (끔찍한) 프로그램을 생각해 보았다.'allocatable i; allocate (i); 끝 '. 나는 그곳에'할당 해제 '를하지 않은 것에 대한 죄책감을 조금도 느끼지 않는다. 할당 취소에 대한 책임을지고 싶지만 여기에는없는 경우가 있습니다. 당신의 질문의 전제가 'deallocate' 진술이 있어야 하는가? 나의 첫 번째 코멘트는 그것을 확증하는 것이었다. – francescalus