单独模块中的内存分配和释放
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"是固定的,那么实际上不需要做任何事情。
这是我的代码:
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"是固定的,那么实际上不需要做任何事情。