weixing1531 发表于 2025-1-16 13:35:48

析构方法什么时候调用?

编译器:gfortran14.1.0
父类、子类均设有析构方法,用于释放动态数组内存。
工况一
type(子类)::p
程序结束时没有调用任何析构方法。
工况二
class( 父类),allocatable::p
allocate(子类::p)
deallocate(p)
程序结束时先调用子类析构方法,后调用父类析构方法。

问:为什么工况一程序结束时没有调用任何析构方法?会不会存在内存泄露?

Transpose 发表于 2025-1-16 16:02:53

本帖最后由 Transpose 于 2025-1-16 16:04 编辑

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

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

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

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

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


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

weixing1531 发表于 2025-1-17 11:09:53

Transpose 发表于 2025-1-16 16:02
1.如果定义成pointer或者allocatable的话,调用deallocate会调用析构函数

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

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

Transpose 发表于 2025-1-18 17:09:40

weixing1531 发表于 2025-1-17 11:09
Fortran难道有垃圾自动回收功能?

通过操作系统自动回收,不算是垃圾回收。
页: [1]
查看完整版本: 析构方法什么时候调用?