Объект с динамическим атрибутом в fortran

#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. По стандарту все должно быть освобождено автоматически, и не должно быть утечек памяти. Но обратите внимание, что в этой области существует несколько существующих ошибок компилятора, поэтому вы можете получить утечку памяти там, где этого делать не следует, в зависимости от того, что вы хотите сделать.