我已经跟踪了以下分配和释放内存的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];
}
答案 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_fftsetupD
和vDSP_destroy_fftsetupD