Освобождение цели массива, но указатель по-прежнему имеет значения [дубликаты]

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

Это потому, что мои значения x все еще загружаются на более высокие уровни памяти (L1, L2 и т. д.), и им потребуется больше времени для обновления своего состояния?

  program ptr_deall

  implicit none

  real, allocatable,target :: x(:)
  real, pointer :: ptr(: )


  allocate(x(100))

  x = 100

  ptr => x
  deallocate(x)
  print*, ptr,size(ptr)

  end program

person A2LBK    schedule 14.10.2019    source источник
comment
Как указано в связанном вопросе, то, что у вас есть, недопустимо для Fortran. Поскольку цель ptr освобождается не через указатель, статус указателя становится неопределенным, и вы не можете позже ссылаться на него так, как делаете. (Когда я запускаю это, я ожидаю увидеть ошибку времени выполнения вместо поведения, которое вы видите: я компилирую с проверкой ошибок большую часть времени.) Если вам действительно нужны подробности о том, почему вы видите конкретные результаты, нам понадобится больше деталей. на вашей установке.   -  person francescalus    schedule 14.10.2019
comment
FWIW, я думаю, что это гораздо более чистый пример, чем связанный вопрос. Нам придется рассмотреть какое-то слияние.   -  person francescalus    schedule 14.10.2019
comment
Я компилирую с помощью -check all -debug full -O0, используя последнюю версию Intel ifort 19.0.5. Я прекрасно понимаю, что это недопустимо. Однако, когда я говорю "deallocate(x)", память должна быть освобождена, и, следовательно, указатель не должен сказать мне, что такое содержимое x. Так почему же он все еще может сказать мне, что такое содержание x.   -  person A2LBK    schedule 14.10.2019
comment
Хорошо, я вижу. У компилятора нет задачи по освобождению памяти, и, следовательно, указатель может по-прежнему указывать на память. Хотя мы, вероятно, никогда не узнаем, когда память действительно освобождается, и поэтому этого следует строго избегать.   -  person A2LBK    schedule 14.10.2019
comment
Да. Поскольку вы не написали корректную программу на Фортране, от компилятора не требуется никаких конкретных действий. Если память не была очищена (и компилятору разрешено оставить ее заполненной), вы можете увидеть ее содержимое. Компилятору также не нужно повторно связывать/аннулировать указатель или жаловаться на то, что вы разыменовали его, когда его статус ассоциации указателя не определен. Как вы говорите, избегайте этого.   -  person francescalus    schedule 14.10.2019
comment
@francescalus, как можно объединить/изменить эти вопросы? Полностью с вами согласен и буду рад помочь, если потребуется/необходимо   -  person jbdv    schedule 14.10.2019
comment
@jbdv, для правильного слияния требуется флаг мода, но я не знаю, достаточно ли похожи эти вопросы. Вполне может быть, что мы снова откроем этот вопрос и закроем другой как дубликат этого (соответствующий ответ). Я не хочу делать это последнее, так как между ними не так уж большая разница. Вопрос Meta Stack Overflow может быть уместным.   -  person francescalus    schedule 14.10.2019