ExtAudioFileOpenURL泄漏

时间:2013-03-18 00:57:56

标签: c++ c malloc audiotoolbox extaudiofile

我正在打开一个音频文件来阅读它,每次我从这个调用者那里得到一个废弃的malloc块。

在循环中,我设置这样的数据(在工具中标记为99.7%的内存使用量)data = (short*)malloc(kSegmentSize*sizeof(short));

并在每次迭代结束时将其释放为free(data);

我不确定这里发生了什么,并希望得到任何帮助。

编辑:KSegmentSize变化数千,最小6000 - 最大50000(投机)

仪器追踪:

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

没有确切的代码:

很确定你有这个问题b / c malloc和free之间的东西正在抛出(你可能已经抓住了它,所以你不要退出循环)。根据是否在C(或Objective-C)或C ++代码中发生这种情况,您的解决方法略有不同。

在C ++中,将malloc / free包装在RAII模式中,以便在展开堆栈时调用free。

class MyData {
public:
    A(size_t numShorts) : dataPtr(0) { dataPtr = malloc(numShorts * sizeof(short)); }
    ~A() { free(dataPtr); }
    operator short*() { return dataPtr; }
private:
    short* dataPtr;
}

MyData data(numShorts);
// do your stuff, you can still use data as you were before due the 'operator short*'
// allow the dtor to be called when you go out of scope

在Objective-C中,您需要使用finally块:

void* myPtr = 0;
@try { myPtr = malloc(...); }
@catch {}
@finally { free(myPtr); }

答案 1 :(得分:1)

建议您首先简化,例如注释掉(最好使用#if 0)除malloc / free之外的所有代码。运行代码并确保没有废弃的堆块。然后逐渐重新引入剩余的代码并重新运行直到遇到问题,然后进行调试。

答案 2 :(得分:0)

很抱歉回答我自己的问题,但在评论出代码后备份堆栈跟踪,实际问题与文件没有被处理有关。

调用ExtAudioFileDispose(audioFile);解决了这个隐藏的错误。仪器并不完全清楚,并将malloc标记为泄漏。为了公平的mallocs,从ExtAudioOpenFile方法引用的文件中的数据,不处理文件引用留下泄漏。