2011-11-09 8 views
0

私はモンテカルロシミュレーションを行っています。これは、複数回実行してから個々の結果を平均します。それぞれの実行の後、私はシミュレーションで必要なもののために割り当てられたメモリを解放したい。このものの1つはsitesの配列です。各siteは、タイプがSLEのリンクリストを1つのメンバーとして持つ構造体です。ですから、すべてを解放するために、まずリンクリストを繰り返して各ノードを解放してからsites配列のメモリを解放してください。完全に異なるメモリを解放した後のセグメンテーションフォールト

しかし、非常に奇妙なことが起こっています。シミュレーションは一度正常に実行され、再び開始されます。私はsitesのために必要なすべてのメモリを再割り当てし、上記のリンクリストSLEsを書き換えます。その後、元アレイ上のいくつかの並べ替え操作では、それがセグメンテーションフォルトをMITの与える:私は上記のスニペットでfree(neighbor)を削除すると

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000408468 in sortNeighbors (list=0xad0e00) at mc_init.c:485 
485   while(temp && temp->next) 

、それが正常に動作します。私が言ったように、すべては最初の実行の前のように再配分されます。では、ここで何が起こるのですか?本当に解放されたものと、なぜこのセグメンテーションが起こっているのかについて、より多くの情報を収集するにはどうすればよいですか?


編集:他の奇妙なことは、このソートの始まりはこのようになっていることを、次のとおりです。

if (!list || !list->next) 
    return list; 

SLE * temp = list; 

// Find halfway through the list 
while(temp && temp->next) 
{ 

listlist->nextが存在する場合、私は明示的にチェックし、なぜそれがでセグメンテーションフォルトを与えています条件は?


EDIT2:あなたは、Linux上にある場合は割り当て

sites = (Site *) malloc(args.nsites_arg * sizeof (Site)); 
... 
// s is now one element of the sites array 
while(siteList) 
{ 
    neighbors  = (SLE*) malloc(sizeof (SLE)); 
    ... 
    neighbors->next = s->neighbors; 
    s->neighbors = neighbors; 
    siteList = siteList->next; 
} 
+0

(シミュレーションの実際の計算は、それが何をすべきかんと仮定して)私はその心配 '(void *型) 'free(3)'へのあなたの呼び出しでキャストされた 'sites'は通常、' stdlib.h'ヘッダをインクルードするのを忘れていて、 'free(3)'プロトタイプにアクセスすることができません。 – sarnold

+0

'サイト 'を宣言、割り当て、初期化しましたか? – sarnold

+1

あなたは 'sites'を再割り当てすると言いますが、未使用のものもすべてNULLに設定していますか?そうでなければ古いものはすべて消えてしまっているので、どこにでも手をつないでいませんか? – nos

答えて

1

は、私の答えhereを見てみましょう。それはあなたが解放されたメモリを(あなたの場合、私は理解して)アクセスすることによってSIGSEVを取得すると、メモリが解放された場所、それはあなたを伝えるなどについてvalgrindの、デバッグセグメンテーションフォルトを支援するツール、メモリリーク

だ - それは必要ありませんそれがあなたのスニペットでfreeコールによって解放されたことを示します。 Windows用

+0

私は後にvaligrindを掘り下げようとします。リンクありがとう! – janoliver

0

いくつかのより良い商用ツール:必要な特別なvalgind --tool=memcheck [COMMAND]

それは箱から出して動作しますが、何も:

  • Purifyが
  • は++
+0

私はLinuxに取り組んでいますが、ありがとうございます。 – janoliver

0

はvalgrindのを通してそれを実行してみてください確かめて。

詳細については、Valgrindウェブサイトをご覧ください。

1

バグを検索する前に、すでに実装されているよく実装されたsingle or double linked listsが実装されていることをお勧めします。

または、MEMのバグを気にしたくない場合は、gc garbage collectorに対するリンク

+0

リンクをありがとう。私は実際に依存関係をできるだけシンプルに保ちたいと思っています。私はまだCの学習過程にいるので、問題を見つけて自分で解決したいと思っています。さらに、メモリ管理を自分で行うことで、より慎重になります。リンクされたリストについては、いくつかの大きな構造体で構成されているので、実装を続けると思います。 – janoliver

関連する問題