2012-03-17 31 views
1

私はバージョン12.1.2.273のための私のプログラムを実行した後20111128Fortran 2003プログラムでメモリリークの原因を見つける方法はありますか?

を構築し、IA-32上で動作するアプリケーションのために

インテル(R)FortranコンパイラーXEを使用してFotran 2003を使用して書いて、コンパイルしたFortranのプログラムを持っています長期的には、(それは物理的な計算だ)私は読んだことがある:FortranのRTLメッセージバッファを割り当てるため
メモリが不足し、メッセージ

は、私はそれがどこにあるか、私は見つけることができますどのように私のプログラム でメモリリークに関係していると推測しました漏れが発生し、それを修正する方法は?

答えて

5

最初の回答に示されているように、あなたの質問は非常に一般的であり、特定の回答にはあまり修正できません。ポインタを使用していますか?ポインタは、割り当て可能なものよりも安全性が低くなります。割り当てを行う場合は、割り当て可能なものに切り替えます。

のifortするためのオプションをデバッグするための提案:メモリ不足:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone

+0

私は別のオブジェクトへのポインタと再度ポイントを使用している場合、私は右、repointing後に孤立したオブジェクトの割り当てを解除する必要がありますか?あなたが不要になった –

+1

あなたは、オブジェクトの割り当てを解除する必要があります。あなたはそれを参照するための有効な方法をまだ持っている間にそれを行う必要があります。あなたの唯一の方法は、ポインタ経由で、あなたがメモリをリークしているよりも、ポインタを再割り当てする場合。ポインタとは異なり、それらは自動的に多くの場合、割り当て解除されている、ので、割り当て可能な変数とのリークを持つことが困難です。たとえば、プロシージャのローカルな割当て可能変数は、プロシージャを終了するときに自動的に割当て解除されます。 –

2

これが答えよりも拡張されたコメントの詳細です...

あなたがメモリリークを持っていることを推測しているが、あなたは私たちがあなたにあなたの推測を回すことができたとの情報を与えられていませんでした診断。このような情報がないと、いくつかのアドバイスがあります。

a)Fortranプログラムでのメモリリークは、他のプログラムと同じように発生します。プログラマは、終了時に変数を忘れる(または無視する)ことを忘れてしまいます。 Fortran 2003では割り当て可能なスカラーを持つことができることを忘れないでください。

b)長期にわたる科学計算では、出力の大規模な配列が繰り返し構築されることは珍しくありません。計算の最中にディスクに書き込むほうがよい場合もあります。 I/O(よく、ほとんどO)時間にヒットしますが、メモリ使用量を節約します。

c)Intel Inspectorやさまざまなオープンソースプログラムなど、メモリリークを発見するのに役立つさまざまなツールがあります。

d)プログラムの実行に必要なメモリがどのように変化するかを理解する必要があります。

e)場合によっては、このドメインでは、もっと多くのRAMを購入するだけです。

+0

は、それは私はあなたがツールをしたいのではなくvalgrindのをしようとした場合、私が問題にMEMデバッガ多分 –

+6

のいくつかの種類を診断するために使用できる方法についての詳細を尋ねたい大規模なプログラムです。 –

+0

valgrindのための+1(http://valgrind.org/) – alexurba

1

私はあなたがすでにあなたは、コンパイラから答えてしまったとします。あなたのプログラムのある時点で、大きなメモリを割り当てようとしています。

"-O0 -debug -traceback -check -ftrapuv"フラグを使用してプログラムをコンパイルし、再度実行することができます。インテルデバッガーを使用して、プログラムを1行ずつ表示することができます(私はあなたがどこに問題があると思われるかを意味します)。あなたはvalgrindのような他のツールを使う必要はありません。

いつか、Gfortranでコンパイルすることも役に立ちます。配列の境界を確認するには、異なるコンパイラオプションを使用する必要があることに注意してください。

最後のヒントの1つは、「関連」構造を使用することです。私は個人的にそれを使用して多くの問題があった。それを使用する場合は、コードから削除して、再度確認してください。

+0

私はまた 'associate'構造体にはいくつかの問題を抱えていました。 –

関連する問題