首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据优化级别导致内存泄漏的延迟长度字符变量

根据优化级别导致内存泄漏的延迟长度字符变量
EN

Stack Overflow用户
提问于 2020-06-16 22:08:29
回答 2查看 99关注 0票数 3

我在Ubuntu中使用gfortran 8.4,使用的是一个延迟长度的字符变量,如下例所示:

代码语言:javascript
复制
PROGRAM test
   IMPLICIT NONE
   CHARACTER(LEN=:),ALLOCATABLE :: str 
   str = '10'
END PROGRAM test

如果我使用以下命令编译它:

代码语言:javascript
复制
gfortran-8 test.f90 -o test -O0

当使用Valgrind运行程序时,我得到一个内存泄漏:

代码语言:javascript
复制
==29119== HEAP SUMMARY:
==29119==     in use at exit: 2 bytes in 1 blocks
==29119==   total heap usage: 22 allocs, 21 frees, 13,522 bytes allocated
==29119== 
==29119== LEAK SUMMARY:
==29119==    definitely lost: 2 bytes in 1 blocks
==29119==    indirectly lost: 0 bytes in 0 blocks
==29119==      possibly lost: 0 bytes in 0 blocks
==29119==    still reachable: 0 bytes in 0 blocks
==29119==         suppressed: 0 bytes in 0 blocks

但是,使用以下命令编译程序:

代码语言:javascript
复制
gfortran-8 test.f90 -o test -O1

我进入了Valgrind:

代码语言:javascript
复制
==29130== HEAP SUMMARY:
==29130==     in use at exit: 0 bytes in 0 blocks
==29130==   total heap usage: 21 allocs, 21 frees, 13,520 bytes allocated
==29130== 
==29130== All heap blocks were freed -- no leaks are possible

我不明白为什么在编译时没有应用优化的情况下会发生内存泄漏。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-17 03:06:28

让操作系统为一个生命周期直到程序结束的变量进行内存清理可能不是很好,但它仍然有效。

为了避免valgrind中的这些误报泄漏,使用block构造将您的代码封闭在主程序所包含的作用域中就足够了。

票数 1
EN

Stack Overflow用户

发布于 2020-06-27 02:00:18

在主程序中声明的所有变量或作为模块变量声明的所有变量都隐式为save。保存的变量不会自动释放。Fortran标准不强制在程序结束时释放数组。不管怎样,它们都会被你的操作系统回收。

您可以手动释放数组,或者如果您希望获得自动重新分配,您可以将该逻辑和可分配变量移动到从主程序输入的子例程中。这样,当子例程结束时,该子例程的局部可分配变量将被释放。

或者,您也可以使用blockend block创建一个块,并在块内声明可分配变量及其带来的所有信息。当块的执行完成时,它们将被释放。

从技术上讲,编译器为你的程序生成的代码不会维护可分配描述符内的指针,直到valgrind希望它们“仍然可达”的时刻。这是一个你不必担心的技术性问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62410496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档