我尝试释放一个指向另一个类型的对象的类(*)指针。
我知道声明的类型和动态类型之间的区别。我不应该使用类(*)指针访问对象中的任何变量。因此,当使用类(*)指针释放对象时,我期待一个错误。但它工作正常。 Valgrind也没有显示内存泄漏。
我很好奇为什么。这是否意味着“deallocate”隐式检测动态类型?任何解释都将不胜感激。
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 )
答案 0 :(得分:2)
是 - 解除分配考虑动态类型。代码片段符合标准。
在运行时,程序的内部知道多态指针引用的对象的动态类型 - 多态对象可以由跟踪对象的数据和对象的类型和类型参数的描述符实现。 。这个知识是程序如何执行SELECT TYPE等构造。
当通过指针释放对象时,要求释放的对象是先前通过指针分配的对象(但它不必是相同的指针 - 请注意Fortran运行时必须具有检测违反此要求的能力)以及引用被解除分配的事物的指针必须引用整个事物(即如果你有一个扩展类型的对象,你不能通过一个非多态指针解除分配对象的父组件)。您的代码符合这两个要求。