C++ realloc在先前稳定的函数中崩溃
显然,SDL_混合器中的这个功能一直在消亡,我不知道为什么。有人有什么想法吗?根据visual studio,崩溃是由Windows触发realloc()行中某个断点引起的 如果有区别的话,所讨论的代码来自SDL_Mixer的SVN版本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 **))
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));