尽管最终确定,Fortran 派生类型数组和内存泄漏

2023-12-28

尽管我已经编写了最终的过程,但我定义了一个派生类型并遇到了一些内存释放问题。代码如下

module ModuleCoordinate
  implicit none

  type :: TCoordinate
    real(8),dimension(:),pointer :: Coordinate => NULL()
    contains
      procedure :: TCoordinateAssignment
      generic,public :: Assignment(=) => TCoordinateAssignment
      final :: TCoordinateDel
  end type TCoordinate

  interface TCoordinate
    module procedure :: TCoordinateInit
  end interface TCoordinate

  contains
    subroutine TCoordinateDel(self)
      type(TCoordinate),intent(inout) :: self
      if(associated(self%Coordinate))deallocate(self%Coordinate)
    end subroutine TCoordinateDel

    subroutine TCoordinateAssignment(O1,O2)
      class(TCoordinate),intent(out) :: O1
      type(TCoordinate),intent(in) :: O2
      if(associated(O2%Coordinate))allocate(O1%Coordinate,source=O2%Coordinate)
    end subroutine TCoordinateAssignment

    type(TCoordinate) function TCoordinateInit(IVal1,IVal2) result(self)
      real(8),intent(in) :: IVal1,IVal2
      allocate(self%Coordinate(2))
      self%Coordinate=(/IVal1,IVal2/)
    end function TCoordinateInit
end module ModuleCoordinate

测试代码如下

program test
  implicit none
  integer(4),parameter :: NLoop=40000
  integer(4) :: i
  do i=1,NLoop
    call TestMemory1()
    call TestMemory2()
  end do
  pause
end program test

subroutine TestMemory1()
  use ModuleCoordinate
  implicit none
  integer(4),parameter :: DN=10
  integer(4) :: i
  type(TCoordinate),dimension(DN) :: a
  do i=1,DN
    a(i)=TCoordinate(1.0_8,1.0_8)
  end do
end subroutine TestMemory1

subroutine TestMemory2()
  use ModuleCoordinate
  implicit none
  type(TCoordinate) :: b1,b2,b3,b4,b5,b6,b7,b8,b9,b10
  b1=TCoordinate(1.0_8,1.0_8)
  b2=TCoordinate(1.0_8,1.0_8)
  b3=TCoordinate(1.0_8,1.0_8)
  b4=TCoordinate(1.0_8,1.0_8)
  b5=TCoordinate(1.0_8,1.0_8)
  b6=TCoordinate(1.0_8,1.0_8)
  b7=TCoordinate(1.0_8,1.0_8)
  b8=TCoordinate(1.0_8,1.0_8)
  b9=TCoordinate(1.0_8,1.0_8)
  b10=TCoordinate(1.0_8,1.0_8)
end subroutine TestMemory2

事实证明,子程序TestMemory2可以,同时TestMemory1不是,这意味着当声明此派生类型的数组时,最终过程不起作用并且内存泄漏。

但是,如果我删除=> NULL()在右边Coordinate在这个派生类型的定义中,两个子例程似乎都运行良好。

当指针指向时有什么区别Coordinate正在被解除分配吗?如果重要的话,编译器是 ifort_2013_sp1.3.174 。


在终结过程的描述中我们看到(Fortran 2008, 4.5.6.2)

如果实体的动态类型具有最终子例程,其虚拟参数具有与正在最终确定的实体相同的类型类型参数和等级,则以该实体作为实际参数来调用它。否则,如果存在一个基本的最终子例程,其虚拟参数具有相同的值 kind 类型参数作为被最终确定的实体,以该实体作为实际参数来调用。否则,此时不会调用任何子例程。

有一个仅为标量(等级 0)实体提供的派生类型的最终子例程。要最终确定您的 1 级实体,最简单的方法(在本例中似乎)是使您拥有的子例程成为元素。

我有点不愿意提及=>NULL()方面,因为我目前没有方法来测试我要写的内容,但我会推测。

如果没有=>NULL()默认初始化指针组件具有未定义的关联状态。这意味着,当你这样做时

    b1=TCoordinate(1.0_8,1.0_8)

有趣的事情发生了。

作为作业的一部分b1在进入时最终确定TCoordinateAssignment。最终确定涉及调用associated与未定义关联状态的指针。这是不允许的(因此可能会出现任何结果)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管最终确定,Fortran 派生类型数组和内存泄漏 的相关文章

  • Symfony2 Doctrine2 内存泄漏/超出内存限制

    我在symfony2和doctrine2的结合上遇到了很多麻烦 我必须处理巨大的数据集 大约 2 3 百万次写入和读取 并且必须做大量额外的工作以避免内存不足 我找出了两个要点 即 泄漏 内存 它们实际上并不是真正泄漏 而是分配了很多内存
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • 该 Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler

    我正在开发一个带有服务的 Android 2 3 3 应用程序 我在该服务中有这个与主要活动进行通信 public class UDPListenerService extends Service private static final
  • Fortran 2003,选择类型以区分“实数”和“实数数组”

    我的问题是 可以select type用块来区分real realInput from real realArrayInput 很清楚如何select type可以用于区分派生类型 但对我来说不太清楚它如何 或是否 可以用于内在类型 在 M
  • 重复 .ajax 调用导致 jQuery 内存泄漏

    我正在使用以下模式 该模式在 Firefox 中会泄漏内存 function function var callee arguments callee ajax url success function setTimeout callee
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • 如何包装 fortran write 语句

    我想包装 fortran写语句 http software intel com sites products documentation doclib stdxe 2013 composerxe compiler fortran lin 在
  • 关于for循环中的fortran continue语句的问题

    我正在分析 Fortran 代码并有一个简单的问题 我想知道下面代码中 100 和 200 处的 继续 语句的作用 它会增加 i 和 j 计数器吗 如果是这样的话 不会if not flg 那么条件包含flg循环中 flg 的 最后一个值
  • iPhone应用程序NSNumber内存泄漏

    我遇到了内存泄漏 但我不知道它从哪里来以及如何修复它 在某些时候 我计算两个位置之间的距离 double calc self getDistance location to otherLocation NSNumber distance N
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉
  • 我如何知道谁持有shared_ptr<>?

    I use boost shared ptr在我的 C 应用程序中 内存问题确实很严重 应用程序占用大量内存 但是 因为我将每个新对象放入shared ptr 当应用程序退出时 无法检测到内存泄漏 一定有类似的东西std vector
  • 使用 OpenMP 编译会导致内存泄漏

    根据 valgrind 的说法 使用 OpenMP 编译简单的 hello world 程序时可能会导致内存泄漏 这是没有意义的 因为 hello world 程序并没有有意使用任何 OpenMP 功能 假设下面的程序名为hi c并根据 g
  • DOMDocument PHP 内存泄漏

    在 MAC 上的 MAMP 下运行 PHP 5 3 6 内存使用量每调用 x 次 3 到 8 次 就会增加 直到脚本因内存耗尽而终止 我该如何解决 libxml use internal errors true while true dom
  • 为什么最后一个关闭的 MDI 子窗体没有被垃圾回收?

    我们的应用程序中存在内存泄漏问题 我已成功通过以下简单示例复制了其中一个问题 复制设置 1 创建以下辅助类 用于跟踪对象创建 销毁 public class TestObject public static int Count get se
  • 尝试读取名单后返回的状态不是预期的

    我想从文件中读取名单 但在名单不存在的情况下实现捕获选项 从我读到的here http msg ucsf edu local programs IBM Compilers Fortran html pgs lr76 htm我期望状态为 84
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • gfortran 支持尾调用消除吗?

    我编写了这个小程序来测试 gfortran 是否执行尾调用消除 program tailrec implicit none print tailrecsum 5 0 contains recursive function tailrecsu

随机推荐

  • Shell 脚本中是否有类似于 C++ 中的“包含防护”的机制?

    让我们看一个例子 在我的 main sh 中 我想获取 a sh 和 b sh 的源码 然而 a sh 可能已经采购了 b sh 这样就会导致b sh中的代码被执行两次 C 中是否有类似 包含防护 的机制 如果您正在采购脚本 通常会使用它们
  • eclipse 中的 java.io.FileNotFoundException

    Code import java io import java util Scanner public class Driver private int colorStrength private String color public s
  • 获取gmail电子邮件内容并传输到google电子表格并进行相应安排

    您好 我只是想知道我是否可以提取标签上特定电子邮件的所有电子邮件内容并将它们放入谷歌电子表格中 打开每封电子邮件并将每个数据复制并粘贴到电子表格中进行相应的安排是非常累人的 我尝试在 vb 中创建一个宏来排列电子邮件 但我仍然需要打开每封电
  • 工作单元设计模式[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有人有关于 LINQ to SQL 的工作单元模式的实际示例的任何好的链接 我知道的唯一资源是代码
  • EntityFramework:在两个不同上下文中检索具有条件的数据

    我正在两个不同的数据库之间导入数据 它们具有不同的上下文 所以我有两个不同的背景 目标是将上下文A的一些数据导入到上下文B 上下文 B 中的数据永远不会直接编辑 它们仅从上下文 A 导入 在上下文 B 中 我复制了从中导入数据的 ID 现在
  • 使用fabric.js 在画布上自由绘图

    我正在尝试使用 Fabric js 在画布上自由绘图 但我无法在我这边自由绘制类似喷雾 圆形 纹理模式的图案 我使用此代码 只有铅笔模式绘图可以工作 但是当我选择喷雾和另一种模式是用铅笔绘图 这是我的 HTML这是小提琴墨水 http js
  • Qt中的键盘输入

    我正在开发一个在嵌入式 Linux 上运行的 Qt 应用程序 我对 Qt 业务还很陌生 因为我一个月前才刚刚开始 所以请理解我不是那样的面向对象 P 我的 Qt 应用程序在运行 Linux 的目标上运行 Qt 文档http doc qt i
  • 酒店预订系统价格规则数据库设计

    目前我正在开发酒店预订系统 所以我需要存储未来几天特定日期 日期范围的价格 因此不同日期 日期的价格会有所不同 所以我需要将这些价格和日期详细信息存储到数据库中 我想到了两种结构 第一个模型 room prices room id from
  • Android 上有管理 TCP 数据包的库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Python3 本地 LAN 服务器脚本和我的 Android 设备之间建立连接 在
  • 几个月来按类别划分的玩家排名

    想象一下下面的情况Player表 包含字段 PlayerId Date Kills and Gold 我需要在几个月内按类别 击杀或金牌 获取玩家位置 这是选择 SET rownumber 0 SELECT date rank kills
  • Gradle Kotlin DSL 与 Groovy DSL 等效 用于compileJava 的编译器参数

    对于 Gradle Java 插件 以下 Groovy DSL 的 Kotlin DSL 等效项是什么 compileJava options compilerArgs Xdoclint all missing Xlint all task
  • 不要释放已合并到 dev 分支的所有功能

    我们有2个特点A and B已经合并到dev分行 分行dev用于测试环境并且这两个功能都经过测试 现在我们只想发布唯一的功能A 怎么做 我们的 git flow 是不是错了 Your git flow到目前为止看起来还不错 它根本不是用来释
  • 如何使用排列()首先显示 NA

    样本数据 temp data frame col list NA 1 2 3 Using arrange temp gt arrange col gives col 1 1 2 2 3 3 4 NA and temp gt arrange
  • 在 bookshelf.js 中设置 value = value +1

    只是想问 如何使用 bookshelf js 更新 mysql DB 1 中的值 例如 Update table set value value 1 where x y 解决了问题 await table query where id id
  • 如何判断类型是否是结构体

    假设我有 2 个结构 type Base struct id int name string type Extended struct Base Email string Password string 我想反映扩展结构以获取它的字段 e
  • $window.location.reload(true) 相当于 CTRL+F5 吗?

    我正在尝试构建一个 版本更新 组件 该组件将在网站更新时显示横幅并提示用户重新加载 不幸的是 当某些用户重新加载其页面时 其页面会被缓存 因此无法正确更新 之前我们告诉他们按 CTRL F5 但我正在寻找一种以编程方式执行此操作的方法 我正
  • 如何分割数组?

    给定一个数组 arr a 1 b 2 c 3 将其分成两个数组的最佳方法是什么 例如 从上面的数组中我想获取以下两个数组 first a b c second 1 2 3 我可以使用以下方法来做到这一点吗collect 好吧 我只是偶然发现
  • 在 Android 上使用 Verizon Motorola Droid 以编程方式将短信发送到电子邮件

    我想知道是否有人知道使用 Verizon 的 CDMA Motorola Droid 手机向电子邮件地址发送 SMS 消息的正确方法 内部消息应用程序似乎会自动执行此操作 虽然 SMSPopup 等第 3 方应用程序似乎无法正确回复电子邮件
  • 是否可以在流星集合更新/删除中使用变量?

    所以我正在考虑按以下方式重构我的代码 Meteor call RemoveNotification this id function error response and Meteor call RemoveAvailablePlayer
  • 尽管最终确定,Fortran 派生类型数组和内存泄漏

    尽管我已经编写了最终的过程 但我定义了一个派生类型并遇到了一些内存释放问题 代码如下 module ModuleCoordinate implicit none type TCoordinate real 8 dimension point