2009-06-06 51 views
0

顯然SDL_Mixer中的這個函數不斷死亡,我不知道爲什麼。有沒有人有任何想法?根據visual studio,崩潰是由Windows觸發realloc()行某處的斷點引起的。realloc在之前穩定的函數中崩潰

有問題的代碼來自SDL_Mixer的SVN版本,如果這有所作爲。

static void add_music_decoder(const char *decoder) 
{ 
    void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 
    if (ptr == NULL) { 
    return; /* oh well, go on without it. */ 
    } 
    music_decoders = (const char **) ptr; 
    music_decoders[num_decoders++] = decoder; 
} 

我使用Visual Studio 2008,並music_decoders和num_decoders都是正確的(music_decoders包含一個指針,字符串「WAVE」,並music_decoders。PTR是00000000,並盡我所知道的,崩潰似乎在realloc()函數中,有沒有人有任何想法我可以處理這個崩潰問題?我不介意爲了完成這個工作而做一些重構,如果涉及到這個問題的話。

+0

你在建立調試模式嗎?如果是這樣,你可以在這裏獲得更多的細節。它究竟在哪裏崩潰?它爲什麼觸發一個斷點? (Windows通常會告訴你爲什麼)等等。 – arke 2009-06-06 20:44:57

+0

大廈在調試模式下,複製SDL_Mixer.DLL文件,目前正使用它生成到程序* .pdb文件,建築/在調試模式下運行該程序,而當它崩潰,我看到飛機墜毀在上面的是區。 – Sukasa 2009-06-06 21:00:44

+0

這是標記C++,但SDL項目是用C寫在C++中,你可能會使用一個std ::向量,以避免有機會得到這個錯誤... – 2009-06-06 23:40:49

回答

5

首先,分配一個num_decoders指針數組無效,然後寫入該數組中的索引num_decoders。大概是第一次調用這個函數時,它分配了0個字節並寫了一個指向結果的指針。這可能會破壞內存分配器的結構,當調用realloc時會導致崩潰/斷點。

順便說一句,如果您報告錯誤,請注意add_chunk_decoder(在mixer.c中)以相同的方式中斷。

我取代

void *ptr = realloc(music_decoders, num_decoders * sizeof (const char **)); 

void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders)); 
0

啊,C編程的樂趣在realloc(或malloc或free)中的崩潰可以通過寫入超過內存塊的邊界來觸發 - 這可能發生在程序中的任何其他地方。以前使用過的是012的一些味道包。在加入第三方解決方案之前,請查看文檔以查看Visual Studio是否提供了這些內容。

2

確保SDL_Mixer.DLL文件和程序內部版本使用相同的C運行時設置。內存可能使用一個CRT分配,並使用另一個CRT重新分配。

在項目設置中,查找C/C++ - >代碼生成。兩者的運行時庫設置應該相同。

0

崩潰通常不會被斷點觸發。在處理斷點的過程中,你是否因崩潰或崩潰而崩潰?

調試輸出窗口應該有一些關於CRT斷點被擊中的信息。例如,它可能會在內存操作中注意到原始塊周圍的保護字節已被修改(由於在調用add_music_decoder之前發生的緩衝區溢出)。當內存被釋放時,CRT可能會檢查這些保護頁面,並且可能在釋放內存時。

1

music_decoders [num_decoders ++] =解碼器;

你是一個在這裏。如果num_decoders是數組的大小,那麼最後一個索引是num_decoders - 1。因此,你應該更換與線:

music_decoders [num_decoders-1] =解碼器;

而且你可能想在函數的開始,因爲要reallow爲新的大小,而不是舊的遞增num_decoders,沒底。

一個額外的事情:你要乘以的sizeof(爲const char *)的大小,而不是與雙星。

相關問題