在这个问题中:Fortran Functions with a pointer result in a normal assignment,指出返回指针的函数不被推荐使用。
我的问题涉及用户定义类型的构造函数。考虑下面的代码:
在代码中,我定义了一个类型,它具有构造函数来分配对象并在对象中分配数组,然后返回指向该对象的指针。
如果构造函数只返回对象,则对象和数组将被复制,然后被释放(至少使用符合标准的编译器)。这可能会导致额外的开销并且会影响我们的内存跟踪。
使用ifort编译上述代码并使用-warn all不会产生警告(最终器中除了未使用的变量)。而且代码表现出了我所期望的行为。在使用-Wall时,使用gfortran编译也能正常工作,但是会产生一个警告。
使用这样的构造函数有哪些风险?据我所知,不会出现悬挂指针,并且我们将更加控制对象分配的时间。一个实现相同结果的解决方法是显式分配对象并将构造函数转换为子例程来设置变量和数组分配,但这看起来不够优雅。还有其他解决方案吗?我们的代码符合Fortran 2008标准。
我的问题涉及用户定义类型的构造函数。考虑下面的代码:
program PointTest
use PointMod, only: PointType
implicit none
class(PointType), allocatable :: TypeObject
TypeObject = PointType(10)
end program PointTest
module PointMod
implicit none
type PointType
real(8), dimension(:), allocatable :: array
contains
final :: Finalizer
end type PointType
interface PointType
procedure NewPointType
end interface PointType
contains
function NewPointType(n) result(TypePointer)
implicit none
integer, intent(in) :: n
type(PointType), pointer :: TypePointer
allocate(TypePointer)
allocate(TypePointer%array(n))
end function NewPointType
subroutine Finalizer(this)
implicit none
type(PointType) :: this
print *, 'Finalizer called'
end subroutine Finalizer
end module PointMod
在代码中,我定义了一个类型,它具有构造函数来分配对象并在对象中分配数组,然后返回指向该对象的指针。
如果构造函数只返回对象,则对象和数组将被复制,然后被释放(至少使用符合标准的编译器)。这可能会导致额外的开销并且会影响我们的内存跟踪。
使用ifort编译上述代码并使用-warn all不会产生警告(最终器中除了未使用的变量)。而且代码表现出了我所期望的行为。在使用-Wall时,使用gfortran编译也能正常工作,但是会产生一个警告。
TypeObject = PointType(10)
1
Warning: POINTER-valued function appears on right-hand side of assignment at (1) [-Wsurprising]
使用这样的构造函数有哪些风险?据我所知,不会出现悬挂指针,并且我们将更加控制对象分配的时间。一个实现相同结果的解决方法是显式分配对象并将构造函数转换为子例程来设置变量和数组分配,但这看起来不够优雅。还有其他解决方案吗?我们的代码符合Fortran 2008标准。
TypeObject
。 - francescalus