Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ realloc在先前稳定的函数中崩溃_C++_Windows_Visual Studio 2008_Breakpoints_Realloc - Fatal编程技术网

C++ realloc在先前稳定的函数中崩溃

C++ realloc在先前稳定的函数中崩溃,c++,windows,visual-studio-2008,breakpoints,realloc,C++,Windows,Visual Studio 2008,Breakpoints,Realloc,显然,SDL_混合器中的这个功能一直在消亡,我不知道为什么。有人有什么想法吗?根据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 **))

显然,SDL_混合器中的这个功能一直在消亡,我不知道为什么。有人有什么想法吗?根据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_解码器和num_解码器都是正确的(music_解码器包含一个指针,指向字符串“WAVE”和music_解码器。ptr是0x00000000,据我所知,崩溃似乎在realloc()中)函数。有人知道我如何处理这个崩溃问题吗?如果归结到这一点,我不介意为了使它工作而进行一些重构。

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

确保SDL\u Mixer.DLL文件您的程序构建使用相同的C运行时设置。内存可能是使用一个CRT分配的,而使用另一个CRT重新分配的


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

崩溃通常不是由断点触发的。您是崩溃、由于断点而崩溃还是在处理断点时崩溃


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

首先,分配一个
num\u解码器的数组
指针,然后写入该数组中的索引
num\u解码器
是无效的。可能是第一次调用此函数时,它分配了0个字节并写入了一个指针to结果。这可能损坏了内存分配器的结构,导致调用
realloc
时出现崩溃/断点

顺便说一句,如果您报告了这个bug,请注意
添加块\u解码器
(在mixer.c中)也是以同样的方式被破坏的

我会替换

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


音乐解码器[num_decoders++]=解码器

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


音乐解码器[num_decoders-1]=解码器


您可能希望在函数开始时增加num_解码器,而不是在函数结束时,因为您希望为新大小而不是旧大小重新加载


还有一件事:你想用sizeof(const char*)乘以大小,而不是用双星。

你是在调试模式下构建的吗?如果是,你可以在这里获得更多详细信息。它到底在哪里崩溃?为什么会触发断点?(Windows通常会告诉你原因)在调试模式下,将SDLYMIX.DLL文件和*.PDB文件复制到使用它的程序中,在调试模式下建立/运行程序,当它崩溃时,我看到崩溃在上面区域。这是标记C++,但是SDL项目是用C编写的,在C++中,你可能会使用一个STD::vector,以避免出错的机会…“函数开头的增量num_解码器”-如果是,请记住在失败的情况下撤消它。不,输出窗口中没有任何内容,错误弹出窗口明确表示这是windows触发的断点。
void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof(*music_decoders));