0

次のコードがメモリに対して何をするのか知りたいです。

program A

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

end program

「allocate(a)」は各反復で同じメモリ位置を参照していますか?プログラムの終了前にdeallocate(a)を使用しないと、メモリリークが発生しますか?

4

2 に答える 2

5

答えは、すでに割り当てられているアイテムを割り当てるのはエラーであるため、このコード例は誤りです。

私が試したコンパイラは、アイテムがとして宣言されている場合、実行時にエラーに気づきますallocatablepointerアイテムが属性で宣言されているかどうかはわかりませんでした。その場合、以前の反復でメモリが予約されているためにメモリリークが発生しますが、ポインタが再利用されているため、メモリリークに到達する方法はありません。

于 2013-02-23T01:37:46.030 に答える
1

他の質問に答えるために、allocatableオブジェクトでメモリをリークすることは不可能です。たとえば、ローカルスコープを持つ割り当て可能な配列は、到達時に割り当て解除されるreturnか、end(保存されていない限り)割り当て可能なタイプのコンポーネントは、親などとともに自動的に割り当て解除されます。

プログラムの終了前にオブジェクトの割り当てを解除しないことは、アドレス指定できないメモリという意味でのリークではありません。これは、実行中にプログラムがオブジェクトにアクセスできるためです。このメモリは、Valgrindによって「まだ到達可能」として報告されます。そのようなオブジェクトの割り当てを解除する方が良いスタイルだと思うかもしれませんが、そうする必要はありません。

于 2013-02-24T23:03:13.503 に答える