2015-03-13 9 views
6

FORTRAN, jeśli mają allocatable wachlarz typów pochodnych, z których każdy składa się z wskaźnika i allocatable tablicy,Czy zwalnianie typu wyprowadzonego z Fortranu automatycznie zwalnia również tablice i wskaźniki członków?

type group 
    real, pointer :: object 
    real, allocatable :: objectData(:,:) 
end type group 

type(group), allocatable :: myGroup(:) 

ja w stanie zwalnianie wszystkie pamięci zawarte w tego typu przez proste pojedyncze połączenia

deallocate(myGroup) 

czy muszę zwalnianie tablice obrębie każdego typu pierwszego, przed dealokując typ pochodny:

do i = 1, size(myGroup) 
    nullify(myGroup(i)%object) 
    deallocate(myGroup(i)%objectData) 
end do 

deallocate(myGroup) 

Przechodzę do opcji 2 i anuluję całą pamięć przed zwolnieniem typu pochodnego, jeśli nie tylko po to, aby zapewnić, że wycieki pamięci się nie pojawią, ale jeśli opcja 1 jest równoważna, to byłaby przydatna do wykorzystania w przyszłości i uratuje mnie kilka linie kodu.

Odpowiedz

6

Tylko alokowane komponenty są automatycznie zwalniane. Musisz sam zdeterminować wskaźniki.

Bądź ostrożny, trzeba deallocate wskaźnik, nie tylko zniweczyć. Nullifying to po prostu usuwa odniesienie do przydzielonej pamięci. Jeśli nie zwolnisz, nastąpi przeciek pamięci.

+0

Ups, dobrze zadzwoń do przypomnienia, aby również zwolnić wskaźniki. Dzięki! To odpowiada na moje pytanie. – vincentjs

4

Wiesz, że allocatable components are deallocated automatically, ale wskaźniki nie są. Ale dla

chciałbym móc cofnąć przydział pamięci wszystkie zawarte w tego typu po prostu przez co jedno połączenie

odpowiedź brzmi: tak (z pewnym wysiłkiem).

Jeśli typ group jest możliwy do sfinalizowania, wówczas jednostka tego typu zostaje sfinalizowana, gdy następuje dezalokacja.

type group 
    real, pointer :: object 
    real, allocatable :: objectData(:,:) 
contains 
    final tidy_up 
end type group 

procedury

subroutine tidy_up(myGroup_array) 
    type(group), intent(inout) :: myGroup_array(:) 
    ! ... deallocate the pointers in the elements of the array 
end subroutine 

Można użyć tej finalizację dbać o składowych wskaźnika.

Wreszcie, należy pamiętać o some subtleties. Zauważ, że to nieco zmniejsza twoją kontrolę nad tym, czy wskaźnik jest dealokowany (jest wiele razy, kiedy byś tego nie chciał).

+1

Zawsze o tym zapominam, ponieważ gfortran wciąż jest nieco w tyle, ale po pełnym wsparciu będzie to wspaniała rzecz. –

+0

To kolejne zastrzeżenie: trzeba wspierać kompilator. – francescalus

Powiązane problemy