Утечка ExtAudioFileOpenURL

Я открываю аудиофайл, чтобы прочитать его, и каждый раз получаю заброшенный блок malloc от этого вызывающего.

В цикле я устанавливаю такие данные (которые помечены как использование памяти в инструментах как 99,7%). data = (short*)malloc(kSegmentSize*sizeof(short));

и освободи это так free(data); в конце каждой итерации.

Я не совсем уверен, что здесь происходит, и буду признателен за любую помощь.

РЕДАКТИРОВАТЬ: KSegmentSize варьируется в тысячах, от минимума 6000 — максимум 50000 (спекулятивный)

Трассировка инструментов:

введите описание изображения здесь

введите описание изображения здесь

2

Решение

Не имея точного кода:

Уверен, что у вас возникла эта проблема, потому что что-то между 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

Другие решения

Предложите начать с упрощения, например, закомментируйте (желательно используя #if 0) весь код, кроме malloc / free. Запустите код и убедитесь, что не осталось пустых блоков кучи. Затем постепенно вводите оставшийся код и повторяйте его, пока не столкнетесь с проблемой, затем выполните отладку.

1

Извините, что отвечаю на мой собственный вопрос, но после комментирования резервной копии трассировки стека реальная проблема заключалась в том, что файл не удалялся.

призвание ExtAudioFileDispose(audioFile); решил эту скрытую ошибку. Приборы были не совсем понятны и отмечены маллоками как утечка. Справедливости ради следует отметить, что из-за того, что из данных, которые были в файле, на который ссылается метод ExtAudioOpenFile, не было удалено указание файла, возникла утечка.

0
По вопросам рекламы [email protected]