C内存管理问题

时间:2012-07-25 00:29:34

标签: c memory-management

我已经跟踪了以下分配和释放内存的EXC_BAD_ACCESS。它涉及Xcode中的加速框架。主要问题是这段代码是循环的。如果我强制循环只迭代一次然后它工作正常。但是当它循环(7次)时,它会在第二次迭代时导致错误。这看起来有什么不对吗?

编辑:*添加了实际代码。如果我删除某些部分,但是这个部分会运行,但似乎内存管理不佳会导致问题

#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];
}

2 个答案:

答案 0 :(得分:2)

您的问题可能是您正在将malloc转换为值。当你正在标记这个c时,我假设你正在编译c,在这种情况下,你应该看到前一个问题的答案,为什么使用malloc进行转换是坏的:

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

  

在使用强制转换而不包括stdlib.h时,您可能会遇到不可预测的运行时错误。

     

所以你身边的错误不是强制转换,而是忘记包含stdlib.h。编译器可能会认为malloc是一个返回int的函数,因此将malloc实际返回的void *指针转换为int,然后由于显式转换而转换为指针类型。在某些平台上,int和指针可能占用不同的字节数,因此类型转换可能会导致数据损坏。

尽管如此,正如答案所说,你不应该进行MALLOC RETURNS,因为void *被安全地隐式转换为你指定的任何东西。

正如另一位回答者所说:

vDSP_destroy_fftsetupD(fftSetup);

也可以释放你在事故中分配的记忆。

答案 1 :(得分:2)

DSPDoubleSplitComplex的析构函数是否有可能释放这两个已分配的块?

也可能只允许您在流程生命周期内拨打vDSP_create_fftsetupDvDSP_destroy_fftsetupD