1

ポインタが関連付けられていると、割り当て解除時にダブルフリーエラーが発生します。未定義の動作が進行中であると思われますが、どこから、どのように探し始めるのかわかりません。未定義の動作をどのように追跡しますか?

コンパイラーはIntel12です。コードが巨大なため投稿できません。問題の原因がコードにあるかどうかさえわかりません。同僚の図書館にあるかもしれません。gdbを使用してデバッグを試みましたが、それほど遠くはありません。これはエラーです。

malloc:*オブジェクト0x102302f20のエラー:解放されるポインターが割り当てられませんでした*デバッグするためにmalloc_error_breakにブレークポイントを設定します

その直前の行は、trueを出力するprint *、associated(pointer)です。

これはバックトレースです

#0  0x00007fff9327b6c0 in malloc_error_break ()
#1  0x00007fff9327b805 in free ()
#2  0x0000000100d27470 in for_dealloc_allocatable ()
#3  0x0000000100506699 in sharedarraysmodule_mp_deleterealsharedarray2_ () at SharedArrays.f90:609
#4  0x00000001003bbc4e in gammaaggregatormodule_mp_deleteprivate_ () at GammaAggregator.f90:86
#5  0x0000000102300bc0 in ?? ()
Previous frame inner to this frame (gdb could not unwind past this frame)
4

1 に答える 1

4

長いコメント、答えに向けて(申し訳ありませんが、抵抗できませんでした)指摘するかもしれません...

衒学的に言えば、コンパイラの最良の推測は「解放されるポインターが割り当てられていない」であるように見えます。undefinedしかし Fortranでは、associatedポインターには statuses しかないdisassociatedため、エラー メッセージは、コンパイラーが実行可能ファイルにリンクするシステム関数の呼び出しから発生する場合があります。

そうは言っても、私は次のものを探します:

  • ターゲットへのポインターがスコープ内にある間にターゲットがスコープ外になる。Fortran 2003 標準の状態 (注 16.13)

    モジュール・プログラム・ユニットからのポインターは、使用関連付けを介してサブプログラムでアクセスできます。このようなポインターは、サブプログラムで宣言されているターゲットが保存されていない限り、存続期間がそのターゲットよりも長くなります。したがって、そのようなポインタがローカル ターゲットに関連付けられている場合、サブプログラムによって定義されたプロシージャの実行が完了すると、ターゲットが存在しなくなり、ポインタが「ダングリング」状態になる可能性があります。この標準では、そのようなポインターは未定義の関連付けステータスを持つと見なされます。それらは関連付けられているわけでも、関連付けられていないわけでもありません。それらは、そのステータスが再確立されるまで、プログラムで再び使用されることはありません。ポインター ターゲットが存在しなくなったことをプロセッサが検出できる必要はありません。

associated同じドキュメントには、組み込み関数に渡されるポインターの関連付けステータスが未定義であってはならないことも記載されているため、プログラムが嘘をついてそれを伝えることはおそらく許容されますassociated(undefined_pointer)==.true.

  • 割り当て可能なターゲットが、スコープ外に出るか、deallocate()呼び出しの結果として割り当て解除されています。
  • 宣言時にポインターが無効化されているreal, pointer :: rptr => null()(これは一般的には良いことであると考えられています。コードが準拠していることを確認する必要があります)。
  • ポインターが関連付けられる前に無効化されていますが、null ポインターを無効化することは標準によるとエラーではないと思います。
  • ポインターへのポインター。

あなたが報告するエラーメッセージは、モジュール変数が範囲外になるケースがあることを示唆する傾向がありますが、すでに観察したように、特定するのは難しいです.

これで問題が解決しない場合は、インテルの技術サポートに連絡してください。非常に役に立ちます。コードの問題を見つけるのが得意です。

于 2012-07-06T14:59:24.923 に答える