带有指针的 Fortran 函数导致正常赋值
Fortran Functions with a pointer result in a normal assignment
在对此处找到的问题进行一些讨论后
我认为了解具有指针结果的函数何时适合用于普通赋值或指针赋值会很有用。例如,给定这个简单的函数
function pointer_result(this)
implicit none
type(test_type),intent(in) pointer :: this
type(test_type), pointer :: pointer_result
allocate(pointer_result)
end function
我通常会做 test=>pointer_result(test)
,其中 test
已使用 pointer
属性声明。虽然正常分配 test=pointer_result(test)
是合法的,但它意味着不同的东西。
与指针赋值相比,普通赋值意味着什么?
什么时候使用一个或另一个赋值有意义?
正常作业
test = pointer_result()
表示test
当前目标的值将被结果指针指向的值覆盖。如果 test
指向某个无效地址(未定义或为空),程序将崩溃或产生未定义的结果。函数分配的匿名目标将不再有指向它的指针,内存将泄漏。
这几乎没有任何合法用途,但当有人打错字并写成 =
而不是 =>
时,很可能会发生这种情况。这是一个非常容易制作的函数,一些风格指南建议永远不要使用指针函数。
在对此处找到的问题进行一些讨论后
function pointer_result(this)
implicit none
type(test_type),intent(in) pointer :: this
type(test_type), pointer :: pointer_result
allocate(pointer_result)
end function
我通常会做 test=>pointer_result(test)
,其中 test
已使用 pointer
属性声明。虽然正常分配 test=pointer_result(test)
是合法的,但它意味着不同的东西。
与指针赋值相比,普通赋值意味着什么?
什么时候使用一个或另一个赋值有意义?
正常作业
test = pointer_result()
表示test
当前目标的值将被结果指针指向的值覆盖。如果 test
指向某个无效地址(未定义或为空),程序将崩溃或产生未定义的结果。函数分配的匿名目标将不再有指向它的指针,内存将泄漏。
这几乎没有任何合法用途,但当有人打错字并写成 =
而不是 =>
时,很可能会发生这种情况。这是一个非常容易制作的函数,一些风格指南建议永远不要使用指针函数。