我正在打开一个音频文件来阅读它,每次我都会从这个调用者那里得到一个废弃的 malloc 块。
在一个循环中,我设置了这样的数据(在仪器中标记为内存使用率为 99.7%)data = (short*)malloc(kSegmentSize*sizeof(short));
free(data);
并在每次迭代结束时像这样释放它。
我不太确定这里发生了什么,如果有任何帮助,我将不胜感激。
编辑: KSegmentSize 变化数千,从最小 6000 - 最大 50000(推测)
仪器跟踪:
我正在打开一个音频文件来阅读它,每次我都会从这个调用者那里得到一个废弃的 malloc 块。
在一个循环中,我设置了这样的数据(在仪器中标记为内存使用率为 99.7%)data = (short*)malloc(kSegmentSize*sizeof(short));
free(data);
并在每次迭代结束时像这样释放它。
我不太确定这里发生了什么,如果有任何帮助,我将不胜感激。
编辑: KSegmentSize 变化数千,从最小 6000 - 最大 50000(推测)
仪器跟踪:
没有确切的代码:
很确定你有这个问题 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); }
建议您从简化开始,例如注释掉(最好使用#if 0)除 malloc/free 之外的所有代码。运行代码并确保没有废弃的堆块。然后逐渐重新引入剩余的代码,重新运行,直到遇到问题,然后调试。
很抱歉回答我自己的问题,但是在注释掉代码备份堆栈跟踪之后,实际问题与未处理的文件有关。
调用ExtAudioFileDispose(audioFile);
解决了这个隐藏的错误。Instruments 并不完全清楚,并将 mallocs 标记为泄漏。公平地说,来自 ExtAudioOpenFile 方法引用的文件中的数据的 malloc,不处理文件引用留下了泄漏。