Fortran динамические объекты
Я пытаюсь создать подпрограмму, которая возвращает данные в виде указателя:
Я хочу что-то подобное:
subroutine f(p)
type(tra), pointer p
type(tra), target :: instance
p=>instance
do_work(instance)
end subroutine
Строго говоря, я хочу реализовать аналог C++ "нового" оператора.
Я хочу затем использовать такую подпрограмму следующим образом:
subroutine other
type(tra), pointer :: p1,p2
call f(p1)
call f(p2)
end subroutine
Приведенный выше код может не работать, так как я предполагаю, что "экземпляр" внутри f уничтожается после выхода из f, и следующий вызов f снова создает "экземпляр" в том же месте в памяти.
В частности, я нахожу с p1
а также p2
указывая на те же объекты, но я думаю, это зависит от компилятора. Это правда?
Я думаю, что возможное решение:
subroutine f(p)
type(tra), pointer p
type(tra), allocatable, target :: instance(:)
p=>instance(1)
do_work(instance(1))
end subroutine
Это "официальный" способ ведения дел?
1 ответ
Строго говоря, я хочу реализовать аналог C++ "нового" оператора.
это ALLOCATE
, То, что вы пытаетесь сделать, должно быть просто так:
subroutine f(p)
type(tra), pointer :: p
! you can actually leak memory this way! caution required.
if(associated(p)) then
stop "possible memory leak - p was associated"
end
allocate(p)
do_work(p)
end subroutine
Приведенный выше код может не работать, так как я предполагаю, что "экземпляр" внутри f уничтожается после выхода из f, и следующий вызов f снова создает "экземпляр" в том же месте в памяти.
Нет, это не так Локальные переменные подпрограммы обычно "распределяются" один раз (и даже инициализируются только один раз), см., Например, спецификацию Fortran 90, глава 14, особенно раздел 14.7.