0

显然 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 () 函数。有谁知道我该如何处理这个崩溃问题?如果归根结底,我不介意为了使这项工作正常进行一些重构。

4

5 回答 5

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)); 
于 2009-06-06T22:30:51.317 回答
2

确保 SDL_Mixer.DLL 文件和您的程序构建使用相同的 C 运行时设置。有可能使用一个 CRT 分配内存,并使用另一个 CRT 重新分配内存。

在项目设置中,查找 C/C++ -> 代码生成。两者的运行时库设置应该相同。

于 2009-06-06T21:23:19.377 回答
1

music_decoders[num_decoders++] = 解码器;

你是这里的一员。如果 num_decoders 是数组的大小,则最后一个索引是 num_decoders - 1。因此,您应该将该行替换为:

music_decoders[num_decoders-1] = 解码器;

并且您可能希望在函数的开头增加 num_decoders,而不是在结尾处增加,因为您想重新考虑新的大小,而不是旧的大小。

另外一件事:您想将大小与 sizeof (const char *) 相乘,而不是与双星相乘。

于 2009-06-06T22:46:48.973 回答
0

啊,C编程的乐趣。realloc(或 malloc 或 free)中的崩溃可以通过写入超出内存块的边界来触发——这可能发生在程序中的其他任何地方。我过去使用的方法是调试 malloc包的一些风格。在使用第三方解决方案之前,请查看文档以查看 Visual Studio 是否提供了与这些内容类似的任何内容。

于 2009-06-06T20:39:38.590 回答
0

崩溃通常不会由断点触发。您是崩溃、由于断点而中断还是在处理断点期间崩溃?

调试输出窗口应该有一些关于为什么 CRT 断点被命中的信息。例如,它可能会在内存操作期间注意到原始块周围的保护字节已被修改(由于在 add_music_decoder 甚至调用之前发生的缓冲区溢出)。CRT 将在释放内存时检查这些保护页,并可能在重新分配内存时检查这些保护页。

于 2009-06-06T22:22:55.480 回答