【问题标题】:Fortran: dellocate unlimited polymorphic pointerFortran:释放无限多态指针
【发布时间】:2015-10-07 06:30:20
【问题描述】:

我尝试释放指向另一个类型对象的类(*)指针。

我知道声明类型和动态类型之间的区别。我不应该能够使用类(*)指针访问对象中的任何变量。因此,在使用类(*)指针解除分配对象时,我期待一个错误。但是它工作正常。 Valgrind 也没有显示内存泄漏。

我很好奇为什么。这是否意味着“解除分配”隐式检测动态类型?任何解释将不胜感激。

class(*),     pointer :: ptr => NULL()
class(point), pointer :: ptr_pnt => NULL() ! point is a derived data type

allocate( ptr_pnt )

... ! set the data in ptr_pnt

ptr => ptr_pnt
deallocate( ptr )
nullify( ptr_pnt )

【问题讨论】:

    标签: pointers fortran


    【解决方案1】:

    是的 - 释放考虑动态类型。代码片段符合标准。

    在运行时,程序内部知道多态指针所指的对象的动态类型——多态对象可以通过跟踪对象数据以及对象类型和类型参数的描述符来实现.这些知识就是程序如何执行诸如 SELECT TYPE 之类的结构。

    当通过指针解除分配对象时,要求被解除分配的对象是先前通过指针分配的对象(但它不必是同一个指针 - 另请注意,Fortran 运行时必须具有检测违反此要求的能力)并且指向被释放事物的指针必须引用整个事物(即,如果您有一个扩展类型的对象,则不能通过指向对象的父组件)。您的代码满足这两个要求。

    【讨论】:

    • 正确,类似于 C 中的free(),也不需要任何类型信息。
    • 它有点超出内存管理,所以必须跟踪动态类型 - 考虑诸如释放子可分配组件和调用终结器之类的事情。
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多