次のコードがメモリに対して何をするのか知りたいです。
program A
While (t < large number)
allocate(a)
...
end program
「allocate(a)」は各反復で同じメモリ位置を参照していますか?プログラムの終了前にdeallocate(a)を使用しないと、メモリリークが発生しますか?
次のコードがメモリに対して何をするのか知りたいです。
program A
While (t < large number)
allocate(a)
...
end program
「allocate(a)」は各反復で同じメモリ位置を参照していますか?プログラムの終了前にdeallocate(a)を使用しないと、メモリリークが発生しますか?
答えは、すでに割り当てられているアイテムを割り当てるのはエラーであるため、このコード例は誤りです。
私が試したコンパイラは、アイテムがとして宣言されている場合、実行時にエラーに気づきますallocatable
。pointer
アイテムが属性で宣言されているかどうかはわかりませんでした。その場合、以前の反復でメモリが予約されているためにメモリリークが発生しますが、ポインタが再利用されているため、メモリリークに到達する方法はありません。
他の質問に答えるために、allocatable
オブジェクトでメモリをリークすることは不可能です。たとえば、ローカルスコープを持つ割り当て可能な配列は、到達時に割り当て解除されるreturn
か、end
(保存されていない限り)割り当て可能なタイプのコンポーネントは、親などとともに自動的に割り当て解除されます。
プログラムの終了前にオブジェクトの割り当てを解除しないことは、アドレス指定できないメモリという意味でのリークではありません。これは、実行中にプログラムがオブジェクトにアクセスできるためです。このメモリは、Valgrindによって「まだ到達可能」として報告されます。そのようなオブジェクトの割り当てを解除する方が良いスタイルだと思うかもしれませんが、そうする必要はありません。