Я открываю аудиофайл, чтобы прочитать его, и каждый раз получаю заброшенный блок malloc от этого вызывающего.
В цикле я устанавливаю такие данные (которые помечены как использование памяти в инструментах как 99,7%). data = (short*)malloc(kSegmentSize*sizeof(short));
и освободи это так free(data);
в конце каждой итерации.
Я не совсем уверен, что здесь происходит, и буду признателен за любую помощь.
РЕДАКТИРОВАТЬ: KSegmentSize варьируется в тысячах, от минимума 6000 — максимум 50000 (спекулятивный)
Трассировка инструментов:
Не имея точного кода:
Уверен, что у вас возникла эта проблема, потому что что-то между 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);
решил эту скрытую ошибку. Приборы были не совсем понятны и отмечены маллоками как утечка. Справедливости ради следует отметить, что из-за того, что из данных, которые были в файле, на который ссылается метод ExtAudioOpenFile, не было удалено указание файла, возникла утечка.