单独模块中的内存分配和释放

Memory allocation and deallocation in separate module

这是我的代码:

Program Dynamic_Array

Use Variables
Use Allocation_Module
Use Dealloaction_Module

Implicit none

Call Subroutine_0

Call Subroutine_1

End Program Dynamic_Array

Module Variables

Implicit none

Integer :: i , k
Integer , parameter :: Br_sn_cvo = 10
Integer , parameter :: Br_nn_mre = 7
Integer , parameter , dimension ( Br_nn_mre) :: Br_nn_cvo = [ 7 , 6 , 5 , 4 , 3 , 2 , 1 ]
Integer , dimension ( Br_nn_mre ) :: i_nn_dm_1 , i_nn_dm_2

type :: my_type

     integer, allocatable :: my_size(:)

end type my_type

type(my_type), allocatable :: dS_sn(:)

End Module Variables

Module Allocation_Module

Use Variables

Implicit none

Contains

Subroutine Subroutine_0

Allocate(dS_sn(Br_nn_mre))

Loop_1: Do k = 1, Br_nn_mre

        i_nn_dm_1(k) = Br_sn_cvo + Br_nn_mre + 1 + Br_nn_cvo(k) * ( k - 1 )
        i_nn_dm_2(k) = Br_sn_cvo + Br_nn_mre + k * Br_nn_cvo(k)

        Allocate( dS_sn(k)%my_size( i_nn_dm_1(k) : i_nn_dm_2(k)) )

        Loop_2: Do i = i_nn_dm_1(k) , i_nn_dm_2(k)

                   dS_sn(k)%my_size(i) = i + k

                End Do Loop_2

        End do loop_1

End subroutine Subroutine_0

End Module Allocation_Module

Module Dealloaction_Module

Use Variables

Implicit none

Contains

Subroutine Subroutine_1

Do k = 1 , Br_nn_mre

   Deallocate(dS_sn(k)%my_size)

End do

   Deallocate(dS_sn)

Return
End Subroutine Subroutine_1

End Module Dealloaction_Module

我在 Fortran 方面不是经验丰富的程序员,所以我需要问几个关于动态数组的内存分配和释放过程的问题。这段代码有没有内存泄漏的问题? 这是在单独模块中分配内存的正确方法吗? 这是在单独模块中重新分配内存的正确方法吗?

代码中没有内存泄漏。 Fortran 中的 allocatable 个实体不可能发生内存泄漏。只有 pointer 会导致内存泄漏。

使用 allocatable 如果某些东西超出范围,它会自动释放。

您的主数组是一个模块变量,因此它永远不会超出范围(它是 save Fortran 2008 规则隐含的)。因此,如果您不自己释放它,它将保持分配状态,然后在程序终止时被操作系统删除。但那是 而不是 通常认为是内存泄漏。这并不是真的有害,因为没有办法在内存中制作一些被遗忘的数组副本。

在释放大数组 dS_sn 时,单个组件 my_size 可能会超出范围。在这种情况下,它们会根据 Fortran 规则自动解除分配。您不必一一解除分配。

所以你真的不必做

Do k = 1 , Br_nn_mre

   Deallocate(dS_sn(k)%my_size)

End do

正在做

Deallocate(dS_sn)

完全正确。

这是一个例子...

...

IF(ALLOCATED(TheArray)) THEN
  IF(SIZE(TheArray) /= The_Size_I_need) DEALLOCATE(TheArray)
ENDIF
IF(.NOT.  ALLOCATED(TheArray)) ALLOCATE(TheArray(The_Size_I_need))

如果数组被重复用于不同的处理大小,这将很有用。

如果就当前执行而言"always"是固定的,那么实际上不需要做任何事情。