C 释放内存时,不同的图像文件大小会导致分割错误
我正在学习如何在OpenGL中添加纹理,出于教育目的,我决定不使用“stb_image.h”之类的库来加载图像,而是为.bmp图像编写自己的库 我使用的图像的尺寸是1920x1080(全高清),文件大小是6.2MB(6220922字节)。加载图像并将其从蓝、绿、红(BGR)转换为红、绿、蓝(RGB)后,我决定释放BGR版本,但在执行此操作时发生了“分割错误(内核转储)” 我尝试的其中一个方法是使用不同的图像,这会导致错误消失。 新的图像分辨率为1280x1920,文件大小为7.4 MB(7372922字节) 我决定翻转早期图像的尺寸(从1920x1080到1080x1920),然后“分割错误(堆芯转储)”返回 这是C中的相关代码(删除了所有OpenGL和GLFW内容)C 释放内存时,不同的图像文件大小会导致分割错误,c,C,我正在学习如何在OpenGL中添加纹理,出于教育目的,我决定不使用“stb_image.h”之类的库来加载图像,而是为.bmp图像编写自己的库 我使用的图像的尺寸是1920x1080(全高清),文件大小是6.2MB(6220922字节)。加载图像并将其从蓝、绿、红(BGR)转换为红、绿、蓝(RGB)后,我决定释放BGR版本,但在执行此操作时发生了“分割错误(内核转储)” 我尝试的其中一个方法是使用不同的图像,这会导致错误消失。 新的图像分辨率为1280x1920,文件大小为7.4 MB(7372
问题在于这些线路
data[x+(hight-y)*width].r = input[x+y*width+2];
data[x+(hight-y)*width].g = input[x+y*width];
data[x+(hight-y)*width].b = input[x+y*width+1];
当y=0
时,数据的缓冲区超限。这使代码进入未定义的行为状态()
要解决此问题,请将上面显示的三行替换为以下内容
data[x+(hight-y-1)*width].r = input[x+y*width+2];
data[x+(hight-y-1)*width].g = input[x+y*width];
data[x+(hight-y-1)*width].b = input[x+y*width+1];
首先,您需要使用调试器来捕获崩溃,并在代码中找到崩溃发生的时间和地点。我还建议使用Valgrind之类的工具来帮助您查找此类问题。此外,还建议使用RGB
结构的大小,在这种情况下,您没有分配足够的内存。我检查了结构RGB的大小为3字节,没有结构填充。data[x+(hight-y)*width].r=input[x+y*width+2]
当y==0时
写入超过分配的数据
缓冲区的末尾。输入
索引看起来也不正确。请注意,“width”和“hight”局部变量应定义为uint32_t(无符号int),而不是int。否则,您可能会面临整数溢出。
data[x+(hight-y)*width].r = input[x+y*width+2];
data[x+(hight-y)*width].g = input[x+y*width];
data[x+(hight-y)*width].b = input[x+y*width+1];
data[x+(hight-y-1)*width].r = input[x+y*width+2];
data[x+(hight-y-1)*width].g = input[x+y*width];
data[x+(hight-y-1)*width].b = input[x+y*width+1];