2

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

在一个循环中,我设置了这样的数据(在仪器中标记为内存使用率为 99.7%)data = (short*)malloc(kSegmentSize*sizeof(short));

free(data);并在每次迭代结束时像这样释放它。

我不太确定这里发生了什么,如果有任何帮助,我将不胜感激。

编辑: KSegmentSize 变化数千,从最小 6000 - 最大 50000(推测)

仪器跟踪:

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

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); }
于 2013-03-20T11:26:04.487 回答
1

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

于 2013-03-23T01:46:53.650 回答
0

很抱歉回答我自己的问题,但是在注释掉代码备份堆栈跟踪之后,实际问题与未处理的文件有关。

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

于 2013-05-01T14:02:17.433 回答