realloc崩溃在以前稳定的功能

时间:2009-06-06 20:30:32

标签: c++ windows visual-studio-2008 breakpoints realloc

显然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()函数中。有没有人知道如何处理这个崩溃问题?我不介意做一些重构以使这个工作,如果它归结为。

5 个答案:

答案 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)

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

答案 4 :(得分:0)

崩溃通常不会由断点触发。您是否在断点处理期间因断点而崩溃或崩溃?

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