1

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

我想要这样的东西:

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

     p=>instance
     do_work(instance)
end subroutine

严格来说,我想实现 C++“新”运算符的类似物。

然后我想使用如下这样的子程序:

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

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

特别是我发现 withp1p2指向相同的对象,但我想这是依赖于编译器的。是真的吗?

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

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

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

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

4

1 回答 1

1

严格来说,我想实现 C++“新”运算符的类似物。

它是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 节。

于 2012-12-27T23:49:56.520 回答