私はモンテカルロシミュレーションを行っています。これは、複数回実行してから個々の結果を平均します。それぞれの実行の後、私はシミュレーションで必要なもののために割り当てられたメモリを解放したい。このものの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)
{
list
とlist->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;
}
(シミュレーションの実際の計算は、それが何をすべきかんと仮定して)私はその心配 '(void *型) 'free(3)'へのあなたの呼び出しでキャストされた 'sites'は通常、' stdlib.h'ヘッダをインクルードするのを忘れていて、 'free(3)'プロトタイプにアクセスすることができません。 – sarnold
'サイト 'を宣言、割り当て、初期化しましたか? – sarnold
あなたは 'sites'を再割り当てすると言いますが、未使用のものもすべてNULLに設定していますか?そうでなければ古いものはすべて消えてしまっているので、どこにでも手をつないでいませんか? – nos