在子例程内分配数组并将其传回时,FORTRAN 中存在内存泄漏问题

2024-01-23

我使用指针将一些数组传递给子例程,然后在该子例程内分配该数组并将其发送回第一个子例程。在一个模块中我有这样的东西:

module call_test
   subroutine bla
      use test
      double precision, dimension(:), pointer :: xyz
   !
      interface boink
        subroutine boink(a) 
        implicit none 
        double precision, dimension(:), pointer :: a 
        end subroutine boink
      end interface boink
   !
      call boink(xyz)
      deallocate(xyz)
   end subroutine bla
end module call_test

在另一个模块中我有:

module test
   contains
   subroutine boink(a) 
      implicit none 
      double precision, dimension(:), pointer:: a 
      allocate(a(10))
   end subroutine boink
end module test

它工作正常,但问题是每次都执行这个过程,即多次调用子例程 bla ,我分配了一些不会被释放的内存,这导致了我的内存问题。在第一个模块中使用数组“a”后,有什么方法可以在第二个模块中释放它吗?


只有当您多次分配同一个指针而不释放时,才会出现问题。您可以更改分配部分以首先检测指针是否已分配:

if(associated(a))deallocate(a)
allocate(a(10))

当然,如果你指出a到其他一些变量b无法释放,这会导致一些严重的问题。

如果你需要的一切afor 是一个可调整大小的数组,最好制作它allocatable代替pointer。这样你就永远不会出现内存泄漏。

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

在子例程内分配数组并将其传回时,FORTRAN 中存在内存泄漏问题 的相关文章

  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • C:内存池库?

    我需要一些快速 线程安全的内存池库 我用谷歌搜索了很多 但是快速的解决方案没有线程安全 而其他的则非常大 有什么建议么 nedmalloc 和 ptmalloc 都是基于 C 的线程缓存内存管理器 基于 doug lea 的 malloc
  • boost::python:如何调用需要指针的函数?

    我有一个函数 它接受一个 int 指针并通过 boost python 公开它 我怎样才能从Python调用这个函数 在 C 中使用 boost python void foo int i def foo foo 在Python中 impo
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • C++ 中数组的正确分配和释放内存

    我正在处理动态数组 功能empty matrix 创建一个新数组 表示一个矩阵 delete matrix 释放为矩阵分配的所有内存 我的函数中是否出现内存泄漏example 如果我打电话add add a b c 函数中分配的内存会发生什
  • 增强侵入式指针

    我对 boost 的侵入式指针有点困惑 定义说 每一个新intrusive ptr实例将引用计数增加 使用对函数的非限定调用intrusive ptr add ref 将指针作为参数传递给它 同样 当一个intrusive ptr被摧毁 它
  • void* 指针的 C++ 替代品(不是模板)

    看来我对 C 有一个根本性的误解 我喜欢多态容器解决方案 谢谢你让我注意到这一点 所以 我们需要创建一个相对通用的容器类型对象 它还恰好封装了一些业务相关的逻辑 然而 我们需要在这个容器中存储基本上任意的数据 从原始数据类型到复杂类的所有数
  • 将 3 维 numpy 数组传递给 C

    为了提高速度 我正在为我的 Python 程序编写一个 C 扩展 并在尝试传入 3 维 numpy 数组时遇到一些非常奇怪的行为 它适用于二维数组 但我确信我用指针搞砸了一些东西 试图让它适用于第三维 但这是奇怪的部分 如果我只传入一个 3
  • Fortran DLL 导入

    Fortran 中有一段代码罗伯特 L 帕克和菲利普 B 斯塔克 http www stat berkeley edu 7Estark Code sbvq f FORTRAN subroutine bv key m n a b bl bu
  • 简单、高效的弱指针,当目标内存被释放时设置为 NULL

    有没有简单 高效的弱 保护指针 我需要多个指向同一对象的指针 当删除该对象时 这些指针都会自动设置为 NULL 有一个 主 指针始终用于删除对象 但可以有多个其他指针引用同一对象 以下是一些不太符合我的需求的解决方案 QPointer ht
  • 字符数组的文字字符串初始值设定项

    对于数组衰减为指针的情况 规则如下 出现在表达式中的 array of T 类型的左值 参见问题 2 5 衰减 有三个例外 为指向其第一个元素的指针 结果指针的类型是指向 T 的指针 例外情况是数组是 sizeof 或 运算符的操作数 或者
  • 使用 Cygwin64 的 Fortran MPI

    我正在使用 Codeblock IDE 编写和编译我的 Fortran 程序 现在我想将 MPI 包含到我的 GNU Fortran 编译器中 在遵循 GNU GCC 编译器的一些指南之后 我突然想到我需要为 MPICH2 设置以下内容 有
  • 如果我每次创建粒子时都强制重新初始化每个粒子,我是否应该使用粒子池

    我正在 XNA4 中创建一个粒子系统 但遇到了问题 我的第一个粒子系统是一个简单的粒子列表 其实例是在需要时创建的 但后来我读到了有关使用池的内容 我的第二个系统由一个充满粒子的池和一个发射器 控制器组成 我的池非常基本 这是代码 clas
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • php按值复制数组元素,而不是按引用

    我有以下代码 data x this gt x gt getResults data y data x some code here to modify data y this causes undesirably data x to be
  • Forth 中 S" ..." 的生命周期是多少?

    我一直在尝试阅读此内容 但找不到任何提及 根据标准 创建的字符串S 无法修改 并且通过简单的实验Gforth http en wikipedia org wiki Gforth很明显 字符串的空间不是来自字典或填充区域 hex here 7
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 确定数组的大小(如果传递给函数)

    如果将数组传递给另一个函数 未传递大小 是否可以确定数组的大小 数组的初始化类似于 int array XXX 我知道不可能执行 sizeof 因为它会返回指针的大小 我问的原因是因为我需要在传递数组的另一个函数内运行 for 循环 我尝试

随机推荐