使用fft加速器时的内存警告

时间:2013-01-03 13:11:02

标签: iphone objective-c ios accelerator

我在这里发布了一个我使用的功能,以获得加速器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对系统来说很重要吗?

任何摆脱这种警告的方法都会对我有所帮助。

非常感谢。

2 个答案:

答案 0 :(得分:3)

这些事情应该在你的计划开始时完成一次:

  • 使用float *buffer = malloc(NumberOfElements * sizeof *buffer);等代码为缓冲区分配内存。
  • 使用FFTSetup setup = vDSP_create_fftsetup(log2n, FFT_RADIX2);等代码创建FFT设置。
  • 同时测试返回值。如果mallocvDSP_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);