Fortran 使用指向多个目标的同一指针时内存泄漏

Fortran 使用指向多个目标的同一指针时内存泄漏,fortran,intel-fortran,Fortran,Intel Fortran,我的IDE是Visual Studio 2010,带有集成的英特尔Fortran编译器。编译器的版本为:英特尔并行工作室XE 2011 我没有Fortran方面的编程经验,所以我需要一些关于使用指针从.txt文件中读取数据的帮助。这是我的示例代码: Module Derived_type implicit none Type , public :: Something private Real :: Somth_1 Integer :: Somth_2 c

我的IDE是Visual Studio 2010,带有集成的英特尔Fortran编译器。编译器的版本为:英特尔并行工作室XE 2011

我没有Fortran方面的编程经验,所以我需要一些关于使用指针从
.txt
文件中读取数据的帮助。这是我的示例代码:

Module Derived_type

implicit none

Type , public :: Something

  private

       Real :: Somth_1
    Integer :: Somth_2

  contains

    procedure , public :: read_input => read_data_input
    procedure , public :: t_Somth_1 => t_data_Somth_1
    procedure , public :: t_Somth_2 => t_data_Somth_2

End Type Something

private :: read_data_input
private :: t_data_Somth_1 , t_data_Somth_2

contains

Subroutine read_data_input( This , Un_r )

  Class( Something ) :: This
  Integer , intent( in ) :: Un_r

  Read ( Un_r , * , Err = 100 ) This%Somth_1
  Read ( Un_r , * , Err = 101 ) This%Somth_2

Return

100 Stop ( "Read format error - 100 !!!" )
101 Stop ( "Read format error - 101 !!!" )

End Subroutine read_data_input

Function t_data_Somth_1 ( This ) result( data_Somth_1 )

  Class( Something ) :: This
  Real :: data_Somth_1

  data_Somth_1 = This%Somth_1

End Function t_data_Somth_1

Function t_data_Somth_2 ( This ) result( data_Somth_2 )

  Class( Something ) :: This
  Integer :: data_Somth_2

  data_Somth_2 = This%Somth_2

End Function t_data_Somth_2

End Module Derived_type

Program Memory_leaking

Use , non_intrinsic :: Derived_type

Implicit none

Integer :: i , alloc_err , dealloc_err
Integer , parameter :: N_snv = 3
Character( 256 ) :: Name
Character(*),parameter :: a00 = '("Input_",i1,".txt")'

Class( Something ) , pointer :: Po_Something

Type( Something ) , allocatable , target :: Tar_Something(:)

! Memory allocation

allocate ( Po_Something , Stat = alloc_err )

If ( alloc_err .ne. 0 ) Stop ( "Allocation wrong - Po_Something !!!")

If ( .not. allocated ( Tar_Something ) ) allocate( Tar_Something( N_snv ) , stat = alloc_err )

If ( alloc_err .ne. 0 ) Stop ( "Allocation wrong - Tar_Something !!!")


Do i = 1 , N_snv

   Po_Something => Tar_Something(i)

   Write( Name , a00 ) i

   Open( 15 , File = Name , Status = 'Unknown' , Action = 'Read' )

      Call Po_Something%read_input( 15 )

   Close( 15 , Status = 'Keep' )

   Write(*,*) Po_Something%t_Somth_1() , Po_Something%t_Somth_2()

End Do

! Memory deallocation

deallocate ( Po_Something , Stat = dealloc_err )

If ( dealloc_err .ne. 0 ) Stop ( "deAllocation wrong - Po_Something !!!")

If ( allocated ( Tar_Something ) ) deallocate( Tar_Something, stat = dealloc_err )

If ( dealloc_err .ne. 0 ) Stop ( "deAllocation wrong - Tar_Something !!!")

End program Memory_leaking
我有一个派生类型的单数组,我想使用相同的指针从
.txt
文件中读取每个数组的数据,就像我的示例代码一样。 在执行完do循环后,是否需要断开连接BeatWaen指针和目标?
这种情况下是否存在内存泄漏

是的,您有内存泄漏

allocate ( Po_Something , Stat = alloc_err )
在这里,您手动为指针变量分配了存储空间,并指向其内存地址

Po_Something => Tar_Something(i)
紧接着,您将POITE更改为另一个存储(可分配变量),并保留了之前分配的存储。在这个指针关联之后,再也没有指向您手动分配的地址的引用了。程序将无法在结束时解除分配它

因为您没有使用第一次分配的存储,所以这里的解决方案就是不这样做。指针将指向循环中已分配的内存

可分配变量是自动释放的(在现代Fortran中),但在更改其目标之前,手动为指针变量分配的任何内存都需要手动释放

检查我的另一个答案,关于何时需要手动解除分配以供参考。


(比这更好的是,下载一份Fortran标准以供参考)

你有理由认为可能存在吗?如果答案是肯定的,我需要解释一下,因为我想学习。如果“Po_Something”不是可分配变量怎么办?这种情况下有内存泄漏吗?有必要在循环结束时将指针置零吗?嗯,有些东西是不可分配的。I是一个“指针”,它们是不同的属性。(两者都可以动态分配,但这就是它们的共同点)。指针变量可以指向不同的地址,就像目标一样。可分配变量不能,但它们的内存是由系统自动监视和管理的(请检查链接),不必在最后将其置零“空化”的意思是让它指向任何地方,它不涉及内存管理。所以只是为了解决这个问题。如果没有为
pou\u something
指针变量分配内存,则循环内不存在内存泄漏危险?否。如果是静态变量或可分配变量,则不会发生内存泄漏。此外,如果任何答案解决了您的问题,您可以将其标记为已接受的答案。:)