【问题标题】:No virtual destructors in fortran 2003?fortran 2003 中没有虚拟析构函数?
【发布时间】:2012-06-14 22:48:14
【问题描述】:

我是否正确理解 F2k3 中没有虚拟析构函数?

stefanos-imac:oop borini$ cat a.f90
module AModule
   type :: AType
      contains
      final :: A_dtor
   end type
contains
   subroutine A_dtor(self)
      type(AType), intent(inout) :: self

      print *, "A_dtor"

   end subroutine
end

stefanos-imac:oop borini$ cat b.f90 
module BModule
   use AModule
   type,extends(AType) :: BType
      contains
      final :: B_dtor
   end type
contains
   subroutine B_dtor(self)
      type(BType), intent(inout) :: self

      print *, "B_dtor"

   end subroutine
end

stefanos-imac:oop borini$ cat x.f90 
program x
   use AModule
   use BModule

   class (AType), pointer :: baseptr
   type(BType), pointer :: derivedptr

   allocate(derivedptr)
   baseptr => derivedptr
   deallocate(baseptr)

end program

stefanos-imac:oop borini$ ./a.out 
 A_dtor
forrtl: severe (173): A pointer passed to DEALLOCATE points to an array that cannot be deallocated
Image              PC                Routine            Line        Source             
a.out              0000000108A731F4  Unknown               Unknown  Unknown
a.out              0000000108A7198E  Unknown               Unknown  Unknown
a.out              0000000108A4D791  Unknown               Unknown  Unknown
a.out              0000000108A2283E  Unknown               Unknown  Unknown
a.out              0000000108A3B930  Unknown               Unknown  Unknown
a.out              0000000108A1EF10  Unknown               Unknown  Unknown
a.out              0000000108A0A104  Unknown               Unknown  Unknown
a.out              0000000108A09F0C  Unknown               Unknown  Unknown
a.out              0000000108A09EC4  Unknown               Unknown  Unknown

【问题讨论】:

  • 什么是虚拟析构函数?
  • @HighPerformanceMark :当你通过基指针删除一个对象时,它也会调用派生类型的析构函数。
  • 这正是 Fortran 中应该发生的事情。
  • @VladimirF: 好吧,所以这可能是一个 ifort 错误?
  • 我尝试使用英特尔编译器的最新版本 (12.1.4.325) 编译您的示例。按原样编译它,编译器因内部错误而崩溃。但是,当我为每种类型添加一个组件(只是一个整数)时,代码会编译并且运行时会打印“A_Dtor”

标签: fortran fortran2003


【解决方案1】:

我不太确定您使用的 C++ 或 Java 术语(虚拟)。在谈到 Fortran 时,我更喜欢使用 Fortran 术语。在 Fortran 术语中,终结过程不会被继承,也不能被覆盖。应该执行新类型和扩展类型的终结过程。

据我了解这个问题,即使我没有一个很好的支持它的编译器,你的程序似乎是正确的。我希望输出:

B_dtor
A_dtor

不要对某些特定编译器的 Fortran 2003 和 2008 标准做出假设,因为目前还没有真正的 Fortran 2003 编译器,尽管其中有几个假装是。英特尔 Fortran AFAIK 并未声称完全符合 Fortran 2003。

【讨论】:

  • 是的,但关键是我持有并试图通过类(AType)指针释放 B 对象。我希望能够通过 AType 指针解除分配而不将其转换为特定的实例子类型,否则我必须提供有关特定子类型的释放代码信息,这很烦人,无用且通常很冗长(每次都必须修复)引入了新的派生类型)。我应该假设这是一个编译器错误,还是标准根本不允许从基指针释放...
  • ... 暗示您总是必须将 type() 实体传递给 deallocate(),或者您可以传递 class() 但只绑定到派生类型?
  • 我不懂你。您可以从任何与其兼容的指针中释放实例。这意味着从指向它扩展的任何类的指针。
猜你喜欢
  • 2012-04-13
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2013-07-06
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多