mrcImageClusterAnalysis
【問題内容】 -AR設定無しのときにメモリー解放エラーが発生します。 【使用OS】Mac X10.8.5 【動作条件】(発生したときの設定) -i 入力ファイルリスト(ASCII: mrcファイルx3) -O 【エラー発生箇所】 ファイル名: /src/Objects/DataManip/mrcImage/src/lmrcImageClusterAnalysis.c 関数名: lmrcImageClusterAnalysis (246行目付近) flagNoValue = 0; mrcImageFree(&minCor, "in lmrcImageClusterAnalysis"); ここ-> mrcImageFree(&minOut, "in lmrcImageClusterAnalysis"); minCor = cor; minOut = out; minInfo = linfo->arInitial; 【考察】 解放済みのminOut.Imageをさらに解放しているためと考えます。 -AR有りなら、AutoRotationCorrelationの結果として新規作成されたmrcファイルが書き込まれていますが、 -AR無しなら、DistanceCalcやCorrelation後にminOutになるoutに代入処理が施されています。 この代入処理が'='なので、代入元と代入先のImageが同じアドレスになり結果代入元のImageまで解放されていると思います。 【ソースコード(一部)】 ファイル名: /src/Objects/DataManip/mrcImage/src/lmrcImageClusterAnalysis.c 関数名: lmrcImageDistanceCalc0 (81行目付近)(※ 63行目付近も同様) if(linfo->flagAutoRotation) { distance = lmrcImageDistanceCalcByWardMethodWithAutoRotation(out, cor, clusterN, clusterM, numN, numM, &(linfo->arInitial), linfo->correlationMode, linfo->mode); } else { DEBUGPRINT("By Ward: "); distance = lmrcImageDistanceCalcByWardMethod( clusterN, clusterM, numN, numM, linfo->mode); ここ-> *out = *clusterN; cor->Image = NULL; } 【対策案】 '='代入の代わりにlmrcImageCopyを使用すると実データのコピーをするので、元が解放されないようになると考えます。 (50行目付近: 関数の先頭に加える) mrcImageParaTypeRealCoord offset; offset.x = offset.y = offset.z =0; (81行目付近) // *out = *clusterN; out->Header = clusterN->Header; mrcInit(out, NULL); lmrcImageCopy(out, clusterN, offset);
ご指摘通りですね。 修正しました。
Details