Fortran Coder

查看: 785|回复: 7
打印 上一主题 下一主题

[求助] Function中的内存泄露

[复制链接]

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
跳转到指定楼层
楼主
发表于 2024-5-27 09:47:42 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 愤怒的三炮 于 2024-5-27 13:21 编辑

下面一段测试代码中,Function可能会造成内存泄露。说是“可能造成”,是因为在一台8G内存的机器上使用Visual Studio发生了内存泄露,但另一台40G内存的机器上的VS就没有泄露,不知道具体是什么门道,请前辈给点意见。

[Fortran] 纯文本查看 复制代码
program main

    integer:: a(1000,1000), b(1000,1000) !没有用allocatable,直接声明,不知道有何影响
  
    a = 1

    do i = 1, 5000
        b = func(a)
    end do
    
    contains
    
         function func(arg) result(output)
        
            integer,intent(in):: arg(:,:)
            integer,allocatable::output(:,:)
       
           allocate(output(SIZE(arg,dim=1),SIZE(arg,dim=2)))!此处内存泄露,output没有自动释放
            output = arg + 1
            
        end function
end program


如果我把主程序中的 a,b 数组声明为allocatable的,经测试,几台机器上都没有发生内存泄露,即
[Fortran] 纯文本查看 复制代码
program main

    integer,dimension(:,:),allocatable:: a,b
    allocate(a(1000,1000), b(1000,1000))

  
    a = 1

    do i = 1, 5000
        b = func(a)
    end do
    
    contains
    
         function func(arg) result(output)
        
            integer,intent(in):: arg(:,:)
            integer,allocatable::output(:,:)
       
           allocate(output(SIZE(arg,dim=1),SIZE(arg,dim=2)))!此处无内存泄露,每次返回后output自动释放
            output = arg + 1
            
        end function
end program
无泄露机器上的编译器版本 Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2024.0.0 Build 20231017
有泄露机器上的编译器版本 Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2024.1.0 Build 20240308



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
8#
 楼主| 发表于 2024-5-29 16:09:02 | 只看该作者
li913 发表于 2024-5-28 14:52
可能是编译器版本不同,某些版本有bug

确实,这可能是Version 2024.1.0 Build 20240308版本编译器的bug。

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
7#
发表于 2024-5-28 14:52:26 | 只看该作者
愤怒的三炮 发表于 2024-5-27 18:50
不是,Debug步进时内存从几十兆增长至几个G

可能是编译器版本不同,某些版本有bug

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
6#
 楼主| 发表于 2024-5-27 18:50:43 | 只看该作者
li913 发表于 2024-5-27 17:35
这里显示的是整台电脑的内存使用量,你需要打开任务管理器,查看这个程序的内存使用量。 ...

不是,Debug步进时内存从几十兆增长至几个G

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
5#
发表于 2024-5-27 17:35:44 | 只看该作者
愤怒的三炮 发表于 2024-5-27 13:18
内存已经到1个多G了。

Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2 ...

这里显示的是整台电脑的内存使用量,你需要打开任务管理器,查看这个程序的内存使用量。

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
地板
 楼主| 发表于 2024-5-27 13:18:38 | 只看该作者


内存已经到1个多G了。

Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2024.1.0 Build 20240308

下载.png (150.04 KB, 下载次数: 22)

下载.png

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
板凳
 楼主| 发表于 2024-5-27 12:29:48 | 只看该作者
li913 发表于 2024-5-27 10:29
我debug模式测试了第一个代码,监控了内存使用量,从头到尾都是38M左右,没有内存泄露。编译器是 oneapi202 ...

是的,我的40G内存的那台机器也没有泄露,但是相同的代码,在另外一台机器上泄露了,稍后我放一张图上来。

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2024-5-27 10:29:42 | 只看该作者
我debug模式测试了第一个代码,监控了内存使用量,从头到尾都是38M左右,没有内存泄露。编译器是 oneapi2021
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 11:43

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表