显然SDL_Mixer中的这个功能一直在死,我不知道为什么。有没有人有任何想法?根据visual studio的说法,崩溃是由Windows在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是0x00000000,我能说的最好,崩溃似乎是在realloc()函数中。有没有人知道如何处理这个崩溃问题?我不介意做一些重构以使这个工作,如果它归结为。
答案 0 :(得分: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));
答案 1 :(得分:2)
确保SDL_Mixer.DLL文件和程序构建使用相同的C运行时设置。可能使用一个CRT分配内存,并使用另一个CRT重新分配内存。
在项目设置中,查找C / C ++ - >代码生成。两者的运行时库设置应该相同。
答案 2 :(得分:1)
music_decoders [num_decoders ++] = decoder;
你是一个人。如果num_decoders是数组的大小,则最后一个索引是num_decoders - 1.因此,您应该用以下代码替换该行:
music_decoders [num_decoders-1] = decoder;
你可能想要在函数的开头增加num_decoders,而不是在结尾,因为你想为新的大小而不是旧的大小。
另外一件事:您希望将大小乘以sizeof(const char *),而不是使用double-star。
答案 3 :(得分:0)
答案 4 :(得分:0)
崩溃通常不会由断点触发。您是否在断点处理期间因断点而崩溃或崩溃?
调试输出窗口应该有一些关于CRT断点被命中的信息。例如,它可能会在内存操作期间注意到原始块周围的保护字节已被修改(由于甚至在调用add_music_decoder之前发生的缓冲区溢出)。当内存被释放时,CRT将检查这些保护页面,并且可能在重新分配时也是如此。