next up previous contents
Next: Masked Assignment - Where Up: Arrays Previous: Allocatable Arrays

 

Deallocating Arrays

Heap storage should be reclaimed using the DEALLOCATE statement:

    IF (ALLOCATED(ages)) DEALLOCATE(ages,STAT=ierr)

As a matter of course, the LOGICAL valued intrinsic inquiry function, ALLOCATED, should be used to check on the status of the array before attempting to DEALLOCATE because it is an error to attempt to deallocate an array that has not previously been allocated space or one which does not have the ALLOCATE attribute. Again one should only supply one array per DEALLOCATE statement and the optional STAT= field should always be used. ierr holds a value that reports on the success / failure of the DEALLOCATE request in an analogous way to the ALLOCATE statement.

Memory leakage will occur if a procedure containing an allocatable array (which does not possess the SAVE attribute) is exited without the array being DEALLOCATE dgif. The storage associated with this array becomes inaccessible for the whole of the life of the program.

Consider the following sorting program which can handle any number of items,

    PROGRAM sort_any_number
     !---------------------------------------------------------!
     ! Read numbers into an array, sort into ascending order   !
     ! and display the sorted list                             !
     !---------------------------------------------------------!
     INTEGER, DIMENSION(:), ALLOCATABLE :: nums
     INTEGER :: temp, I, K, n_to_sort, ierr

      PRINT*, 'How many numbers to sort'
      READ*,  n_to_sort

      ALLOCATE( nums(1:n_to_sort), STAT=ierr)
      IF (ierr .NE. 0) THEN
       PRINT*, "nums: Allocation request denied"
       STOP ! halts execution
      END IF

      PRINT*,  'Type in ',n_to_sort, 'values one line at a time'  
      
      DO I=1,n_to_sort
       READ*, nums(I)
      END DO 

      DO I = 1, n_to_sort-1
       DO K = I+1, n_to_sort
        IF(nums(I) > nums(K)) THEN
         temp = nums(K)      ! Store in temporary location        
         nums(K) = nums(I)   ! Swap the contents over                
         nums(I) = temp
        END IF
       END DO 
      END DO 

      DO I = 1, n_to_sort
       PRINT*, 'Rank ',I,' value is ',nums(I)
      END DO 

      IF (ALLOCATED(nums)) DEALLOCATE(nums, STAT=ierr)
      IF (ierr .NE. 0) THEN
       PRINT*, "nums: Deallocation request denied"
      END IF

    END PROGRAM sort_any_number

Return to corresponding overview page gif


next up previous contents
Next: Masked Assignment - Where Up: Arrays Previous: Allocatable Arrays

©University of Liverpool, 1997
Wed May 28 20:20:27 BST 1997
Not for commercial use.