Fortran动态对象

时间:2012-12-27 23:34:12

标签: memory-management fortran

我正在尝试创建一个将数据作为指针返回的子例程:

我想要这样的东西:

subroutine f(p)
     type(tra), pointer p
     type(tra), target :: instance

     p=>instance
     do_work(instance)
end subroutine

严格来说,我想实现c ++“new”运算符的模拟。

我想要使用如下的子程序:

subroutine other
    type(tra), pointer :: p1,p2
    call f(p1)
    call f(p2)
end subroutine

上面的代码可能不起作用,因为我认为f中的“实例”在f退出后被销毁,而f的下一次调用再次在内存中的同一位置创建“实例”。

特别是我发现p1p2指向相同的对象,但我想这是编译器相关的。 是真的吗

我认为可能的解决方案是:

subroutine f(p)
     type(tra), pointer p
     type(tra), allocatable, target :: instance(:)

     p=>instance(1)
     do_work(instance(1))
end subroutine

这是“官方”的做事方式吗?

1 个答案:

答案 0 :(得分:2)

  

严格来说,我想实现c ++“new”运算符的模拟。

ALLOCATE。你要做的事情应该是这样:

subroutine f(p)
     type(tra), pointer :: p

     ! you can actually leak memory this way! caution required.
     if(associated(p)) then
         stop "possible memory leak - p was associated"
     end
     allocate(p)
     do_work(p)
end subroutine
  

上面的代码可能不起作用,因为我认为f中的“实例”在f退出后被销毁,而f的下一次调用再次在内存中的同一位置创建“实例”。

不,这不是真的。本地子程序变量通常被“分配”一次(甚至只初始化一次),参见例如Fortran 90规范,第14章,特别是第14.7节。