#oop #dynamic #memory-leaks #fortran
Вопрос:
Я программирую на Фортране, и мне нужно создать класс объектов, который имеет динамический вектор в качестве атрибута. Вот минимальный пример того, чего я пытаюсь достичь.
MODULE my_class
PRIVATE
PUBLIC my_object
! define my object with a dynamic attribute
TYPE my_object
private
integer:: size;
real, allocatable:: tab(:); ! here the dynamic vector
CONTAINS
private
final:: destructor;
END TYPE my_object
! define an interface for object constructor
INTERFACE my_object
module procedure:: constructor;
END INTERFACE my_object
CONTAINS
! define constructor
FUNCTION constructor(size) RESULT(obj)
integer, intent(in):: size;
type(my_object):: obj;
obj%size= size;
allocate(obj%tab(size))
END FUNCTION constructor
! define destructor
SUBROUTINE destructor(this)
class(my_object):: this;
if (allocated(this%tab)) deallocate(this%tab)
END SUBROUTINE
END MODULE my_class
Но я не уверен, что это правильный способ сделать это. Нет ли риска утечки памяти при такой реализации в случае многократной инициализации? С помощью этого кода, например :
PROGRAM test
USE my_class
IMPLICIT NONE
type(my_object):: obj;
obj= my_object(1000);
obj= my_object(3000);
END PROGRAM test
Была obj%tab
ли должным образом освобождена первая инстанция?
Или мне следует переопределить оператор равенства?
Спасибо, что помогли мне выяснить, как Фортран справляется с этим.
Комментарии:
1. Во — первых, обратите внимание, что ваш пример неверен и не будет компилироваться-он должен быть
type( my_object )
в процедуре завершенияdestructor
. Но в противном случае да, при втором назначении он будет правильно освобожден до присвоения нового значенияobj
— по сути, пока вы придерживаетесь выделяемых массивов, вы не можете получить утечку памяти в Fortran. Здесь нет необходимости реализовывать оператор присваивания. Где-то должен быть дубликат, но нет времени на поиски.2. По стандарту все должно быть освобождено автоматически, и не должно быть утечек памяти. Но обратите внимание, что в этой области существует несколько существующих ошибок компилятора, поэтому вы можете получить утечку памяти там, где этого делать не следует, в зависимости от того, что вы хотите сделать.