0

我正在为 iphone 编写一个音频应用程序,我需要使用一些 C 代码来处理音频文件。简而言之,在加载了这么多文件后,我的内存泄漏导致应用程序崩溃。问题与我创建的一个结构有关,该结构在读入时保存音频文件。结构的创建如下;

类型定义结构{

    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;

然后像这样在标头中初始化结构;

   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 程序员,并且无法弄清楚我在这里做错了什么导致泄漏。我会很感激一些建议来帮助我找到这个问题,因为我几天来一直在努力解决这个问题,没有任何乐趣。我已经读过在结构中有指针是个坏主意,这可能是我问题的根源吗?

在此先感谢,K。

4

1 回答 1

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] 中没有垃圾

于 2011-02-10T11:20:08.333 回答