Fortran Coder

查看: 256|回复: 3
打印 上一主题 下一主题

析构方法什么时候调用?

[复制链接]

150

帖子

44

主题

1

精华

宗师

F 币
1330 元
贡献
638 点
跳转到指定楼层
楼主
发表于 2025-1-16 13:35:48 来自移动端 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译器:gfortran14.1.0
父类、子类均设有析构方法,用于释放动态数组内存。
工况一
type(子类)::p
程序结束时没有调用任何析构方法。
工况二
class( 父类),allocatable::p
allocate(子类::p)
deallocate(p)
程序结束时先调用子类析构方法,后调用父类析构方法。

问:为什么工况一程序结束时没有调用任何析构方法?会不会存在内存泄露?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

172

帖子

2

主题

1

精华

大师

Vim

F 币
1045 元
贡献
494 点

规矩勋章

沙发
发表于 2025-1-16 16:02:53 | 只看该作者
本帖最后由 Transpose 于 2025-1-16 16:04 编辑

1.如果定义成pointer或者allocatable的话,调用deallocate会调用析构函数

2.如果定义在子程序或者block里面,出了作用域会调用析构函数

3.定义在主程序的,程序运行结束并不会调用析构函数(这个可能是系统自己释放所有内存了,所以不调用析构函数,此处存疑)

4.自定类型使用函数或者默认的构造函数进行赋值,也会调用析构函数 (看起来是创建了一个副本然后再析构掉,因此使用子程序而不是函数可以有效减少析构次数)

上面这几点是根据编译器行为总结的,如果有不正确的可以提出改正


你说的情况应该是第三种。

150

帖子

44

主题

1

精华

宗师

F 币
1330 元
贡献
638 点
板凳
 楼主| 发表于 2025-1-17 11:09:53 | 只看该作者
Transpose 发表于 2025-1-16 16:02
1.如果定义成pointer或者allocatable的话,调用deallocate会调用析构函数

2.如果定义在子程序或者block里 ...

Fortran难道有垃圾自动回收功能?

172

帖子

2

主题

1

精华

大师

Vim

F 币
1045 元
贡献
494 点

规矩勋章

地板
发表于 2025-1-18 17:09:40 | 只看该作者
weixing1531 发表于 2025-1-17 11:09
Fortran难道有垃圾自动回收功能?

通过操作系统自动回收,不算是垃圾回收。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-2-6 00:01

Powered by Tencent X3.4

© 2013-2025 Tencent

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