我正在为iphone编写音频应用程序,我需要使用一些C代码来处理音频文件。简而言之,我有一个内存泄漏导致应用程序在加载了这么多文件后崩溃。该问题与我创建的结构有关,该结构在读入时保存音频文件。结构创建如下;
typedef struct {
UInt32 frameCount; // the total number of frames in the audio data
UInt32 sampleNumber; // the next audio sample to play
BOOL isStereo; // set to true if there is data audioDataRight member
AudioUnitSampleType *audioDataLeft; // complete left channel of audio data read from file
AudioUnitSampleType *audioDataRight; // complete right channel of audio data read file
} soundStruct, *soundStructPtr;
然后在这个标题中初始化Struct;
soundStruct phraseSynthStructArray[3];
然后我尝试将已读入的两个文件加入phraseSynthStructArray[phrase1Index]
和phraseSynthStructArray[phrase2Index]
,并将合并后的文件放入phraseSynthStructArray[synthPhraseIndex]
这样的内容;
- (BOOL) joinPhrases:(UInt32)phrase1Index phrase2Index:(UInt32)phrase2Index synthPhraseIndex:(UInt32)synthPhraseIndex{
// get the combined frame count
UInt64 totalFramesInFile = inArray[phrase1Index].frameCount + inArray[phrase2Index].frameCount;
//now resize the synthPhrase slot buffer to be the same size as both files combined
// phraseOut is used to hold the combined data prior to it being passed into the soundStructArray slot
free(phraseSynthStructArray[synthPhraseIndex].audioDataLeft);
phraseSynthStructArray[synthPhraseIndex].audioDataLeft = NULL;
phraseSynthStructArray[synthPhraseIndex].frameCount = 0;
phraseSynthStructArray[synthPhraseIndex].frameCount = totalFramesInFile;
phraseSynthStructArray[synthPhraseIndex].audioDataLeft = (AudioUnitSampleType *) calloc(totalFramesInFile, sizeof (AudioUnitSampleType));
for (UInt32 frameNumber = 0; frameNumber < inArray[phrase1Index].frameCount; ++frameNumber) {
phraseSynthStructArray[synthPhraseIndex].audioDataLeft[frameNumber] = phraseSynthStructArray[phrase1Index].audioDataLeft[frameNumber];
}
UInt32 sampleNumber=0;
for (UInt32 frameNumber = phraseSynthStructArray[phrase1Index].frameCount; frameNumber < totalFramesInFile; ++frameNumber) {
phraseSynthStructArray[synthPhraseIndex].audioDataLeft[frameNumber] = phraseSynthStructArray[phrase2Index].audioDataLeft[sampleNumber];
sampleNumber++;
}
return YES;
}
一切正常,生成的文件已加入并可以使用。我所拥有的是当我在这里分配内存时,phraseSynthStructArray[synthPhraseIndex].audioDataLeft = (AudioUnitSampleType *) calloc(totalFramesInFile, sizeof (AudioUnitSampleType));
然后在下次调用该方法时,此内存每次都会泄漏并最终导致应用程序崩溃。我需要在这里分配内存的原因是因为必须调整内存大小以容纳连接文件,该文件的长度根据输入文件的大小而变化。
我无法释放操作后的内存,因为在调用该方法之后其他地方需要它并且我之前尝试释放它(在上面的joinPhrases方法中),但这似乎不起作用。我还尝试使用realloc通过将指针传递给先前分配的内存来释放/重新分配内存,但这会导致崩溃,说明EXEC_BAD_ACCESS。
我不是一个经验丰富的C程序员,无法弄清楚我在这里做错了导致泄漏。我会很感激一些建议,以帮助我追查这个问题,因为我已经在没有欢乐的情况下对着这个问题喋喋不休。我已经读过在Structs中使用Pointers这是一个坏主意,这可能是我问题的根源吗?
提前致谢, ķ。
答案 0 :(得分:0)
也许这会有所帮助:
- (BOOL) joinPhrases:(UInt32)phrase1Index phrase2Index:(UInt32)phrase2Index synthPhraseIndex:(UInt32)synthPhraseIndex{
// get the combined frame count
UInt64 totalFramesInFile = inArray[phrase1Index].frameCount + inArray[phrase2Index].frameCount;
. . .
void* old_ptr = phraseSynthStructArray[synthPhraseIndex].audioDataLeft;
phraseSynthStructArray[synthPhraseIndex].audioDataLeft = (AudioUnitSampleType *) calloc(totalFramesInFile, sizeof (AudioUnitSampleType));
if( old_ptr ) free(old_ptr);
. . .
return YES;
}
并确保phraseSynthStructArray中没有垃圾[synthPhraseIndex]