Fortran Coder

查看: 56|回复: 8

[派生类型] fortran deallocate problem

[复制链接]

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
发表于 2018-7-9 16:24:31 | 显示全部楼层 |阅读模式
I have the following question:how do I deallocate array memory in type? Like a%b%c, how do I deallocate c? the specific problem is(The compiler environment I tried are gfortran version gcc4.4.7 and ifort version 18.0.1.):

[Fortran] 纯文本查看 复制代码
module grist_domain_types
         implicit none
         public :: aaa

          type bbb
             real (8), allocatable   :: c(:)
          end type bbb

          type aaa
             type(bbb),  allocatable :: b(:)
          end type aaa

     end module grist_domain_types

     program main
        use grist_domain_types
        type(aaa) :: a
        integer(4) :: time,i
        time=20

        allocate(a%b(1:100000000))
        call sleep(time)!--------------1

        do i=1,100000000
            allocate(a%b(i)%c(1:1))
        enddo
        call sleep(time)!--------------2

        do i=1,100000000
            deallocate(a%b(i)%c)
        enddo
        call sleep(time)!--------------3

        deallocate(a%b)
        call sleep(time)!--------------4
     end program

First,I run this program. Then I use top -p processID to see memory. When the program is executed to 1, the memory is 4.5G. When the program is executed to 2, the memory is 7.5G. When the program is executed to 3, the memory is also 7.5G(but I think is 4.5G). When the program is executed to 4, the memory is 3G(I think is 0G or close to 0G). So deallocate(a%b(i)%c) does not seem to work. However, I use valgrind to see memory. the memory of this program is all deallocate...I used ifort and gfortran. This problem happens no matter which compiler I use. How to explain this question? I allocate many c array in this way,the program will finally crash due to insufficient memory. And how to solve it?
简而言之就是我用dellocate释放a%b(i)%c中的c数组时,内存不会减少,不会被释放掉。我原始程序中会分配很多这样的c数组,到最后程序就崩溃了。原因可能是应该释放掉了(我用valgrind工具看过),但是没有告知操作系统。操作系统不知道。在这里问问,看看有没有遇到同样问题的大佬,怎么释放c数组的内存并且告知操作系统不让我的程序崩溃?求大神帮忙!!!可以复制我上面的测试代码看看。测试步骤:编译上面的代码,然后运行,使用top -p + 进程号查看内存,或者其它方式,程序运行到1处,内存消耗4.5G,2处,7.5G,运行到3处按道理c数组释放了应该是4.5G,但是系统显示还是7.5G,运行到4处应该全部释放掉了应该是0G或者接近0G,但是显示的是3G。


回复

使用道具 举报

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
 楼主| 发表于 2018-7-9 16:52:25 | 显示全部楼层
至极暖贴~~~
回复

使用道具 举报

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
 楼主| 发表于 2018-7-9 16:52:46 | 显示全部楼层
顶帖~~~~~~
回复

使用道具 举报

29

帖子

12

主题

0

精华

熟手

F 币
106 元
贡献
190 点
发表于 2018-7-10 09:40:24 | 显示全部楼层
语法没有问题,我在vs2015+ivf2017的环境下编译,dim=10000000情况下(内存有限,相对于你的少了一位),内存可以正常释放掉。

443

帖子

2

主题

0

精华

大宗师

F 币
2975 元
贡献
1771 点

水王勋章元老勋章热心勋章

发表于 2018-7-10 10:26:32 | 显示全部楼层
lz的代码内存释放正常,也许和Linux操作系统有关
测试环境:
8G内存+64位win7 + MSYS2编译环境(gfortran-7.3)

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
 楼主| 发表于 2018-7-10 16:12:38 | 显示全部楼层
pasuka 发表于 2018-7-10 10:26
lz的代码内存释放正常,也许和Linux操作系统有关
测试环境:
8G内存+64位win7 + MSYS2编译环境(gfortran-7 ...

可能真和操作系统有关吧

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
 楼主| 发表于 2018-7-10 16:14:19 | 显示全部楼层
ksfengjia 发表于 2018-7-10 09:40
语法没有问题,我在vs2015+ivf2017的环境下编译,dim=10000000情况下(内存有限,相对于你的少了一位),内 ...

好吧,我也缩小了规模,还是不能释放c数组

6

帖子

1

主题

0

精华

入门

F 币
29 元
贡献
16 点
 楼主| 发表于 2018-7-10 16:15:16 | 显示全部楼层
谢谢各位大佬的回复!有没有用linux的大佬试试啊

82

帖子

0

主题

0

精华

版主

World Analyser

F 币
273 元
贡献
137 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2018-7-10 19:14:03 | 显示全部楼层
本帖最后由 kyra 于 2018-7-10 19:19 编辑

楼主可以尝试把 100000000 改成 1000000  (也就是去掉2个零)
把 allocate(a%b(i)%c(1:1)) 改成  allocate(a%b(i)%c(100))   !也就是加上2个零

这样对比就明显了。

要知道 c(1:1) 只占8个字节,在64位计算机上,和指针大小一样。释放不释放真的区别不大。

fortran 的可分配数组和指针,他们并不只占8字节(地址),实际上可能在40个字节左右(数组大小,维度,上下限,间距等)。
因此,特别多的数组,建议不要用可分配的。
http://bbs.fcode.cn/thread-829-1-1.html
这个帖子对你有帮助。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2018-7-18 21:56

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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