【发布时间】:2017-08-06 15:17:54
【问题描述】:
我将 Intel Visual Fortran 2015 与 Visual Studio 2012 结合使用。
我尝试了许多不同的方法来尝试在我的代码中创建一个复杂派生类型的副本,但我能想到的每一种方法都会导致内存泄漏,所以我一定是做错了什么。
这是我的问题的简化示例
type Vehicle_T
real :: time
real, dimension(3) :: eciPos
...
a bunch of variables
...
end Type Vehicle_T
type, extends(Vehicle_Entity_T) :: Aircraft_T
real :: alt
...
a bunch of variables
...
end type Aircraft_T
type Track_T
real :: tupdated
...
a bunch of variables
...
class(Vehicle_T), pointer :: object
end type Track_T
type(Track_T) :: a, b
a = constructTrack(various values)
b = copyTrack(a)
contains
!The simplest way I've found that works but causes memory leak
function copyTrack(inTrack) result(outTrack)
type(Track_T), intent(in) :: inTrack
type(Track_T) :: outTrack
outTrack = inTrack
allocate(outTrack%object, source = inTrack%object)
end function copyTrack
!Another method that causes a memory leak
function copyTrack2(inTrack) result(outTrack)
type(Track_T), intent(in) :: inTrack
type(Track_T) :: outTrack
outTrack%tupdated = inTrack%tupdated
...copy all of the rest of the values...
if(associated(outTrack%object)) deallocate(outTrack%object)
allocate(outTrack%object, source = inTrack%object)
end function copyTrack2
【问题讨论】:
-
我没有,(第二个答案:stackoverflow.com/questions/20291814/…)但是,我也尝试过 nullify ,但仍然存在内存泄漏。
-
实际上,我发现这种方法存在问题。我说这行得通是错误的。我会修复原来的帖子。我当时做错的是我正在释放输入对象,然后尝试将该对象复制到输出对象中。
-
deallocate(outTrack%object)解除了outTrack%object的关联,但也解除了其原始目标inTrack%object的分配。 -
感谢您指出这一点。我现在明白了,但这不是主要问题。
-
为什么对象组件是指针?如果在复制具有该组件的派生类型的对象时正在复制与该指针组件关联的事物,则表明派生类型拥有与该指针关联的对象,并且指针组件的使用与此不一致. (存在例外。)
标签: pointers memory-leaks fortran