Что произойдет, если массив повторно выделяется в цикле и никогда не освобождается в Фортране?

Я хочу знать, что следующий код делает с памятью:

program A

While (t < large number)
 allocate(a)
 ...

end program

Относится ли «выделить (а)» к одной и той же ячейке памяти на каждой итерации, и есть ли утечка памяти, если освобождение (а) до конца программы не используется?


person Pippi    schedule 23.02.2013    source источник
comment
a объявлен с атрибутом allocatable или pointer? Или вы хотите получить ответ для обоих случаев?   -  person M. S. B.    schedule 23.02.2013
comment
Вы не можете выделить программу.   -  person Vladimir F    schedule 23.02.2013


Ответы (2)


Ответ заключается в том, что выделение уже выделенного элемента является ошибкой, поэтому этот пример кода ошибочен.

Компиляторы, которые я пробовал, замечают ошибку во время выполнения, если элемент объявлен как allocatable. Они не заметили, если элемент был объявлен с атрибутом pointer. В этом случае у вас есть утечка памяти, так как память была зарезервирована на более ранних итерациях, но больше нет способа добраться до нее, так как указатель был повторно использован.

person M. S. B.    schedule 23.02.2013

Чтобы ответить на ваш другой вопрос, утечка памяти с allocatable объектами невозможна. Например, выделяемые массивы с локальной областью видимости освобождаются по достижении return или end (если они не сохраняются), компоненты выделяемого типа автоматически освобождаются вместе с их родителем и т. д.

Отсутствие освобождения объекта до конца программы на самом деле не является утечкой в ​​смысле неадресуемой памяти, поскольку ваша программа все еще имела доступ к ней во время выполнения. Valgrind сообщит об этой памяти как о «все еще доступной». Вы можете посчитать, что лучше освобождать такие объекты, но это не обязательно.

person sigma    schedule 24.02.2013