У меня есть следующий очень простой код. Чего я не понимаю, так это того, что после того, как я освободил свой массив 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
ptr
освобождается не через указатель, статус указателя становится неопределенным, и вы не можете позже ссылаться на него так, как делаете. (Когда я запускаю это, я ожидаю увидеть ошибку времени выполнения вместо поведения, которое вы видите: я компилирую с проверкой ошибок большую часть времени.) Если вам действительно нужны подробности о том, почему вы видите конкретные результаты, нам понадобится больше деталей. на вашей установке. - person francescalus   schedule 14.10.2019-check all -debug full -O0
, используя последнюю версию Intel ifort 19.0.5. Я прекрасно понимаю, что это недопустимо. Однако, когда я говорю "deallocate(x)", память должна быть освобождена, и, следовательно, указатель не должен сказать мне, что такое содержимое x. Так почему же он все еще может сказать мне, что такое содержание x. - person A2LBK   schedule 14.10.2019