Pointers 用fortran语言破解指针 让我们考虑FORTRAN 中的一个复杂结构 TYPE ComplexStrType ! Static as well as dynamic memory defined here. END TYPE ComplexStrType
定义了一个物理空间(我认为是在堆栈内存上分配的)以使用ComplexStrType的两个变量:Pointers 用fortran语言破解指针 让我们考虑FORTRAN 中的一个复杂结构 TYPE ComplexStrType ! Static as well as dynamic memory defined here. END TYPE ComplexStrType,pointers,memory-management,fortran,dynamic-memory-allocation,stack-memory,Pointers,Memory Management,Fortran,Dynamic Memory Allocation,Stack Memory,定义了一个物理空间(我认为是在堆栈内存上分配的)以使用ComplexStrType的两个变量: TYPE(ComplexStrType) :: SomeComplexStr TYPE(ComplexStrType) :: AnotherComplexStr TYPE(ComplexStrType),POINTER :: PointerComplexStr 然后,我使用SomeComplexStr在堆栈中定义一些内容,并在动态内存中分配一个大空间 现在,假设
TYPE(ComplexStrType) :: SomeComplexStr
TYPE(ComplexStrType) :: AnotherComplexStr
TYPE(ComplexStrType),POINTER :: PointerComplexStr
然后,我使用SomeComplexStr
在堆栈中定义一些内容,并在动态内存中分配一个大空间
现在,假设我想将另一个complexstr指向SomeComplexStr
,并忘记我在堆栈内存中定义的空间指向另一个complexstr。为此,我使用了一个简单但有用的技巧,将某个变量转换为目标
:
FUNCTION TargComplexStr(x)
IMPLICIT NONE
TYPE(ComplexStrType),INTENT(IN),TARGET :: x
TYPE(ComplexStrType),POINTER :: TargComplexStr
TargComplexStr => x
END FUNCTION TargComplexStr
然后我将PointerComplexStr
指向SomeComplexStr
:
PointerComplexStr => TargComplexStr(SomeComplexStr)
AnotherComplexStr = PointerComplexStr
最后,我做另一个complexstr等于PointerComplexStr
:
PointerComplexStr => TargComplexStr(SomeComplexStr)
AnotherComplexStr = PointerComplexStr
在那之后,假设SomeComplexStr
以及另一个complexstr
指向相同的静态和动态内存。
问题是:
- 我如何释放
使用的空间,当我在Begging中定义它时使用它另一个complexstr
- 你如何建议我取消指针
- 这种做法是安全的,还是我必须预期在执行过程中会出现一些奇怪的内存泄漏
- 如果可能,我如何将“定点变量”指向其原始形式?(以防万一,我不得不再次将其用作正常变量)
targetcomplexstr
中使用的“技巧”与您认为的不一样-该函数与简单的指针分配相比没有任何用处
您可以将非目标实际参数与目标伪参数相关联,但当带有目标伪参数的过程完成时,与伪参数关联的任何指针都将变得未定义(F2008 12.5.2.4 p11)
(指针只能与目标关联,因此非目标的东西不能有与之关联的指针。)
这意味着函数的结果是一个具有未定义关联状态的指针。不允许从函数返回具有未定义关联状态的指针(F2008 12.6.2.2 p4)
指针赋值语句将使PointerComplexStr
成为未定义的指针<代码>指针complexstr然后在分配中被引用到另一个complexstr。不允许引用未定义关联状态的指针(F2008 16.5.2.8 p1)
内在赋值创建值的副本。即使右侧的对象是指针,也会出现这种情况—将创建该指针目标值的副本。内在赋值不会在被赋值的顶级数据对象[1]级别上使一个变量引用另一个变量的存储。据我所知,您整个示例代码的意图可以替换为:
AnotherComplexStr = ComplexStr
如果你想做一些不同的事情,那么你需要解释你想做什么
[1] :如果指定的对象类型是具有指针组件的派生类型,则对象值的定义包括指针组件的指针关联状态,但不包括组件本身目标的值(F2008 4.5.8)。技巧您在TargComplexStr
中使用的函数不能按您认为的方式工作-该函数与简单的指针赋值相比没有任何用处
您可以将非目标实际参数与目标伪参数相关联,但当带有目标伪参数的过程完成时,与伪参数关联的任何指针都将变得未定义(F2008 12.5.2.4 p11)
(指针只能与目标关联,因此非目标的东西不能有与之关联的指针。)
这意味着函数的结果是一个具有未定义关联状态的指针。不允许从函数返回具有未定义关联状态的指针(F2008 12.6.2.2 p4)
指针赋值语句将使PointerComplexStr
成为未定义的指针<代码>指针complexstr然后在分配中被引用到另一个complexstr。不允许引用未定义关联状态的指针(F2008 16.5.2.8 p1)
内在赋值创建值的副本。即使右侧的对象是指针,也会出现这种情况—将创建该指针目标值的副本。内在赋值不会在被赋值的顶级数据对象[1]级别上使一个变量引用另一个变量的存储。据我所知,您整个示例代码的意图可以替换为:
AnotherComplexStr = ComplexStr
如果你想做一些不同的事情,那么你需要解释你想做什么
[1] :如果要分配的对象类型是具有指针组件的派生类型,则对象值的定义包括指针组件的指针关联状态,但不包括组件本身目标的值(F2008 4.5.8)。我不明白您试图做什么,但是函数
TargComplexStr
没有用处-它要么复制了普通指针赋值的功能,要么导致未定义的指针。如果AnotherComplexStr
不是指针,那么它就不能出现在指针赋值语句的左侧。我也不明白这一点,如果AnotherComplexStr不是指针,那么AnotherComplexStr=>targetcompl