我在这里发布了一个我使用的功能,以获得加速器fft。
Setup the accelerator framework for fft on the iPhone
工作得很好。 问题是,我实时使用它,所以对于每个新的音频缓冲区,我用新的缓冲区调用这个函数。
由于这些行(可能),我收到了内存警告
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
问题:
我有另一种方法,但要反复使用它们(不要忘记我必须每秒多次用新缓冲液喂它)
我究竟如何释放它们? (代码行)
这可能是因为fft对系统来说很重要吗?
任何摆脱这种警告的方法都会对我有所帮助。
非常感谢。
答案 0 :(得分:3)
这些事情应该在你的计划开始时完成一次:
float *buffer = malloc(NumberOfElements * sizeof *buffer);
等代码为缓冲区分配内存。FFTSetup setup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
等代码创建FFT设置。malloc
或vDSP_create_fftsetup
返回0,则写入错误消息并退出程序或采取其他异常行为。这些事情应该在你的计划结束时完成一次:
vDSP_destroy_fftsetup(setup);
等代码破坏FFT设置。free(buffer);
等代码释放缓冲区的内存。在程序中间,在处理样本时,代码应使用现有的缓冲区和设置。因此,指向缓冲区和设置的变量必须对该代码可见。您可以将它们作为参数传递(可能在一个结构中组合在一起)或将它们设置为全局(这应该只是小程序的临时解决方案)。
应安排您的程序,以便在处理样本时无需分配内存或创建FFT设置。
最终应释放所有已分配的内存。
答案 1 :(得分:2)
如果你是malloc并且永远不会释放,你将会耗尽内存。确保“免费”#39;你的记忆使用free()。
* 注意: free()实际上并没有删除任何内存。它只是告诉系统我们已经完成了内存,并且它可用于其他分配。
// Example:
// allocating memory
int *intpointer;
intpointer = malloc(sizeof(int));
// ... do stuff...
// 'Freeing' it when you are done
free(intpointer);