以下はLibaiffライブラリからのものです。次のエラーが完全にランダムに発生します(つまり、プログラムが問題なく動作することもあれば、このエラーでスタックして、常にこの関数内の同じポイントで中断することもあります)。(1949,0x7fff7b82d310) malloc: * オブジェクト 0xd00000000b400 のエラー: 解放されるポインターが割り当てられませんでした *デバッグするために malloc_error_break にブレークポイントを設定します
私の質問は、r->buffer2
すでに解放されている場合、コントロールがステートメントif (r->buffer2)
を通過してブロックに入って実行を試みることは可能free(r->buffer2)
ですか? 言い換えれば、r->buffer2
解放された場合、解放が再び起ころうとするのを防ぐべきではありませんif (r->buffer2)
か?
static void AIFF_ReadClose(AIFF_Ref r)
{
if (r->buffer)
free(r->buffer);
if (r->buffer2)
free(r->buffer2); // THIS IS WHERE THE BREAK OCCURS EVERYTIME
Unprepare(r);
fclose(r->fd);
free(r);
return;
}
編集:
の定義は次のとおりですAIFF_Ref
。
struct s_AIFF_Ref {
FILE* fd;
int flags;
int stat; /* status */
int segmentSize;
int bitsPerSample;
int nMarkers;
int nChannels;
double samplingRate;
uint64_t nSamples;
int markerPos;
uint64_t len;
uint64_t soundLen;
uint64_t pos;
uint64_t sampleBytes;
uint64_t commonOffSet;
uint64_t soundOffSet;
uint64_t markerOffSet;
IFFType format;
IFFType audioFormat;
void* decoder;
void* pdata;
void* buffer;
size_t buflen;
void* buffer2;
size_t buflen2;
int tics;
};
typedef struct s_AIFF_Ref* AIFF_Ref;
なぜこの奇妙な動作が起こっているのか、どうすれば解決できるのか、誰か提案できますか? ありがとう。