我正在打开一个音频文件来阅读它,每次我从这个调用者那里得到一个废弃的malloc块。
在循环中,我设置这样的数据(在工具中标记为99.7%的内存使用量)data = (short*)malloc(kSegmentSize*sizeof(short));
并在每次迭代结束时将其释放为free(data);
。
我不确定这里发生了什么,并希望得到任何帮助。
编辑:KSegmentSize变化数千,最小6000 - 最大50000(投机)
仪器追踪:
答案 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方法引用的文件中的数据,不处理文件引用留下泄漏。