【问题标题】:difference between POINTER and ALLOCATABLEPOINTER 和 ALLOCATABLE 的区别
【发布时间】:2011-04-30 17:13:20
【问题描述】:

这两个代码有什么区别

type Foo
   real, allocatable :: bar(:)
end type

type Foo
   real, pointer :: bar(:)
end type

尤其是涉及到以下代码时:

type(Foo) :: myfoo
allocate(myfoo%bar(10))

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

    在那种情况下,我看不出有任何主要区别。

    一般来说,ALLOCATABLE arrays are more efficient。但是在 Fortran 90/95 POINTER 数组中更加灵活。例如,不可能将 ALLOCATABLE 数组用作派生类型的组件。 Fortran 2003 解决了这个问题。所以尽可能使用 ALLOCATABLE 数组。

    编辑

    只想提一下程序在尝试分配已分配实体时的行为的显着差异。如果实体是 ALLOCATABLE 你会得到运行时错误。程序

    PROGRAM main
    
      IMPLICIT NONE
    
      TYPE :: foo
        REAL, DIMENSION(:), ALLOCATABLE :: bar
      END TYPE foo
    
      TYPE(foo) :: my_foo
    
      ALLOCATE (my_foo%bar(10))
      ALLOCATE (my_foo%bar(10))
    
    END PROGRAM main
    

    用 gfortran 编译会产生这样的错误信息:

    Fortran runtime error: Attempting to allocate already allocated variable 'my_foo'
    

    相比之下,您可以使用 POINTER 做这些事情。

    【讨论】:

    • 值得一提的是,在关联指针上调用allocate 语句可能会导致内存泄漏(如果没有其他指针指向原始目标)。
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2019-09-29
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多