3

编码

program asd

real,pointer        :: a,b,c

allocate(a)
a=2.0
b=>a
c=>a
deallocate(b) !
print *, associated(c,target=a) ! T

end program

使用英特尔编译器返回 T。我得出结论,“b”不是“a”的完整别名,因为我无法释放“a”占用“b”。所以我的问题是:如果我用

function ptr
  real,pointer   :: var,ptr
  allocate(var)
  ptr=>var
end function

调用此函数后是否可以释放 var?

非常感谢-

4

1 回答 1

7

该标准说(第 6.3.3.2 节):

...解除分配指针目标会导致与目标或目标的一部分关联的任何其他指针的指针关联状态变为未定义。

此外,在第 16.4.2.1 节中,它说:

指针可能具有关联、解除关联或未定义的指针关联状态。

在注释 16.3 中指出:

来自模块程序单元的指针可以通过使用关联在子程序中访问。此类指针的生命周期大于子程序中声明的目标,除非保存此类目标。因此,如果这样的指针与本地目标相关联,则当子程序定义的过程完成执行时,目标可能会不复存在,从而使指针“悬空”。本标准认为此类指针具有未定义的关联状态。它们既没有关联也没有分离。在重新建立其状态之前,不得在计划中再次使用它们。不要求处理器能够检测指针目标何时停止存在。

所有这一切都是说.TRUE.您从英特尔获得的结果是特定于编译器的,因为c具有未定义的关联状态,编译器可以以他们想要的任何方式报告。如果你试图通过 访问ac你会得到一个内存错误(或者即使它有效,它是未定义的并且不是保证)。

同样,您的示例函数同样危险,因为无法保证var函数返回时会存在,这意味着ptr函数结果再次未定义。同样,如果您尝试var通过 的结果进行访问ptr,您将再次遇到内存错误。

如果您希望您的功能正常工作,它需要如下所示:

function ptr
  real, pointer, save :: var
  real,pointer   :: ptr
  allocate(var)
  ptr=>var
end function

Of course, this begs the ultimate question -- why ALLOCATE pointers? It's much safer to use ALLOCATABLE for the target and give it the TARGET attribute.

于 2012-10-16T04:30:53.407 回答