1

EXC_BAD_ACCESS を追跡して、次のメモリの割り当てと割り当て解除を行いました。これには、Xcode の加速フレームワークが含まれます。主な問題は、このコードがループしていることです。ループを1回だけ繰り返すように強制すると、正常に機能します。しかし、ループ (7 回) すると、2 回目の繰り返しでエラーが発生します。これのどれかが間違っているように見えますか?

編集: *実際のコードを追加しました。このセグメントは、特定のパーツなどを削除すると実行されますが、メモリ管理が不十分なため、問題が発生するようです

#import <Foundation/Foundation.h>
#include <math.h>
#include <Accelerate/Accelerate.h>

  for(int i = 0; i < 8; i++)
    {

   int XX[M][m];  //M and m are just 2 ints

   for(int kk = 0; kk < M; kk++)
            {
                for (int kk1 = 0; kk1 < m; kk1++)
                {
                    XX[kk][kk1] = [[x objectAtIndex: (kk + kk1 * J)] intValue];  //x is a NSMutableArray of NSNumber objects
                }

            }

            double FreqRes = (double) freqSamp/n;

            NSMutableArray *freqs = [[NSMutableArray alloc] initWithCapacity: round((freqSamp/2 - FreqRes) - 1)];

            int freqSum = 0;

            for(double i = -1 * freqSamp/2; i < (freqSamp/2 - FreqRes); i+= FreqRes)
            {

                [freqs addObject: [NSNumber numberWithInt: i]];

                if(i == 0)
                {
                    freqSum++;
                }

            }

            int num = [x count];
            int log2n = (int) log2f(num);
            int nOver2 = n / 2;

            FFTSetupD fftSetup = vDSP_create_fftsetupD (log2n, kFFTRadix2);

            double ffx[num];

            DSPDoubleSplitComplex fft_data;
            fft_data.realp = malloc(nOver2 * sizeof(double)); //Error usually thrown on this line in the second iteration.  Regardless of what I put there.  If I add an NSLog here it throws the error on that NSLog
            fft_data.imagp = malloc(nOver2 * sizeof(double));


            for (int i = 0; i < n; ++i)
            {
                ffx[i] = [[x objectAtIndex:i] doubleValue];
            }


            vDSP_ctozD((DSPDoubleComplex *) ffx, 2, &fft_data, 1, nOver2);

            vDSP_fft_zripD (fftSetup, &fft_data, 1, log2n, kFFTDirection_Forward);

            for (int i = 0; i < nOver2; ++i)
            {
                fft_data.realp[i] *= 0.5;
                fft_data.imagp[i] *= 0.5;
            }   

            int temp = 1;

            ffx[0] = abs(fft_data.realp[0]);
            for(int i = 1; i < nOver2; i++)
                ffx[i] = sqrt((fft_data.realp[i] * fft_data.realp[i]) + (fft_data.imagp[i] * fft_data.imagp[i]));
            ffx[nOver2] = abs(fft_data.imagp[0]);
            for(int i = nOver2-1; i > 0; i--)
            {
                ffx[nOver2 + temp] = sqrt((fft_data.realp[i] * fft_data.realp[i]) + (fft_data.imagp[i] * fft_data.imagp[i]));
                temp++;
            }

            //clear Fxx and freqs data
            vDSP_destroy_fftsetupD(fftSetup);
            free(fft_data.imagp);
            free(fft_data.realp);
            [freqs release];
}
4

2 に答える 2

2

問題は、mallocを値にキャストしていることである可能性があります。このcにタグを付けているので、cでコンパイルしていると仮定します。その場合、mallocを使用したキャストが悪い理由に関する前の質問に対するこの回答が表示されます。

https://stackoverflow.com/a/1565552/1515720

stdlib.hを含めずにキャストを使用すると、予期しないランタイムエラーが発生する可能性があります。

したがって、あなたの側のエラーはキャストではなく、stdlib.hを含めるのを忘れています。コンパイラは、mallocがintを返す関数であると想定する場合があるため、mallocによって実際に返されたvoid *ポインタをintに変換し、明示的なキャストによりポインタ型に変換します。一部のプラットフォームでは、intとポインターが異なるバイト数を使用する場合があるため、型変換によってデータが破損する可能性があります。

とはいえ、答えが示すように、void *は割り当てられているものに安全に暗黙的に変換されるため、MALLOCリターンをキャストしないでください。

別の回答者が述べたように:

vDSP_destroy_fftsetupD(fftSetup);

偶然に割り当てたメモリを解放することもできます。

于 2012-07-25T00:35:48.837 に答える
2

のデストラクタがDSPDoubleSplitComplex割り当てられた2つのブロックを解放している可能性はありますか?

vDSP_create_fftsetupDまた、電話をかけることが許可されているのは、プロセスの存続期間中にvDSP_destroy_fftsetupD 1回だけである可能性もあります。

于 2012-07-25T00:37:23.293 に答える