我正在尝试创建一个将数据作为指针返回的子例程:
我想要这样的东西:
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的下一次调用再次在内存中的同一位置创建“实例”。
特别是我发现p1
和p2
指向相同的对象,但我想这是编译器相关的。 是真的吗?
我认为可能的解决方案是:
subroutine f(p)
type(tra), pointer p
type(tra), allocatable, target :: instance(:)
p=>instance(1)
do_work(instance(1))
end subroutine
这是“官方”的做事方式吗?
答案 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节。